shiro拦截认证的过程是什么

发布时间:2021-11-30 10:53:07 作者:iii
来源:亿速云 阅读:158
# Shiro拦截认证的过程是什么

## 目录
1. [Shiro框架概述](#shiro框架概述)
2. [核心组件与认证流程](#核心组件与认证流程)
3. [拦截认证的详细过程](#拦截认证的详细过程)
   - [3.1 请求拦截阶段](#31-请求拦截阶段)
   - [3.2 认证执行流程](#32-认证执行流程)
   - [3.3 结果处理与响应](#33-结果处理与响应)
4. [关键源码解析](#关键源码解析)
5. [实际应用案例](#实际应用案例)
6. [常见问题与解决方案](#常见问题与解决方案)
7. [总结与最佳实践](#总结与最佳实践)

---

## Shiro框架概述
Apache Shiro是一个强大灵活的Java安全框架,提供认证(Authentication)、授权(Authorization)、会话管理和加密等核心功能。其设计哲学是通过直观的API简化复杂的安全需求,开发者只需关注业务逻辑而无需深入底层安全机制。

**核心优势**:
- 轻量级:仅依赖少量JAR包
- 模块化:可单独使用认证或授权模块
- 跨平台:支持Web、非Web和企业级应用

## 核心组件与认证流程
### 基础架构
```java
Subject -> SecurityManager -> Realm
  1. Subject:当前用户的安全视图
  2. SecurityManager:安全操作的核心协调者
  3. Realm:安全数据的桥梁(如数据库、LDAP)

认证流程概览

  1. 收集用户凭证(用户名/密码)
  2. 提交认证请求
  3. 执行凭证匹配
  4. 处理成功/失败结果

拦截认证的详细过程

3.1 请求拦截阶段

在Web环境中,Shiro通过ShiroFilter拦截请求,典型配置如下:

<!-- web.xml配置示例 -->
<filter>
    <filter-name>shiroFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>shiroFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

拦截器链工作流程: 1. 请求到达AbstractShiroFilter 2. 创建Subject实例 3. 执行executeChain方法 4. 匹配配置的过滤器链

3.2 认证执行流程

认证时序图

sequenceDiagram
    participant Client
    participant Filter
    participant SecurityManager
    participant Realm
    
    Client->>Filter: 提交登录请求
    Filter->>SecurityManager: login(token)
    SecurityManager->>Realm: getAuthenticationInfo
    Realm-->>SecurityManager: AuthenticationInfo
    SecurityManager-->>Filter: 认证结果
    Filter-->>Client: 返回响应

关键步骤解析

  1. Token创建

    UsernamePasswordToken token = new UsernamePasswordToken(
       username, password);
    
  2. 提交认证

    Subject currentUser = SecurityUtils.getSubject();
    currentUser.login(token);
    
  3. Realm验证

    protected AuthenticationInfo doGetAuthenticationInfo(
       AuthenticationToken token) throws AuthenticationException {
       // 实现数据库查询等逻辑
    }
    

3.3 结果处理与响应

成功处理: - 创建Subject会话 - 存储Principal信息 - 跳转至成功页面

失败处理: - 抛出特定异常: - IncorrectCredentialsException(密码错误) - UnknownAccountException(账号不存在) - 返回401状态码或错误页面

关键源码解析

SecurityManager实现

public interface SecurityManager extends Authenticator, Authorizer {
    Subject login(Subject subject, AuthenticationToken token)
        throws AuthenticationException;
    // 其他核心方法...
}

认证执行入口

DefaultSecurityManager.login()方法核心逻辑:

public Subject login(Subject subject, AuthenticationToken token) {
    AuthenticationInfo info;
    try {
        info = authenticate(token);
    } catch (AuthenticationException ae) {
        // 异常处理...
    }
    Subject loggedIn = createSubject(token, info, subject);
    notifyEvent(loggedIn, info, token);
    return loggedIn;
}

实际应用案例

Spring Boot集成配置

@Bean
public ShiroFilterFactoryBean shiroFilter() {
    ShiroFilterFactoryBean factory = new ShiroFilterFactoryBean();
    factory.setSecurityManager(securityManager());
    
    Map<String,String> filterChain = new LinkedHashMap<>();
    filterChain.put("/login", "anon");
    filterChain.put("/**", "authc");
    factory.setFilterChainDefinitionMap(filterChain);
    
    return factory;
}

自定义Realm示例

public class CustomRealm extends AuthorizingRealm {
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(
        AuthenticationToken token) {
        
        String username = (String) token.getPrincipal();
        User user = userService.findByUsername(username);
        
        if(user == null) {
            throw new UnknownAccountException();
        }
        
        return new SimpleAuthenticationInfo(
            user.getUsername(),
            user.getPassword(),
            ByteSource.Util.bytes(user.getSalt()),
            getName());
    }
}

常见问题与解决方案

高频问题排查表

问题现象 可能原因 解决方案
认证始终失败 Realm未正确配置 检查spring.shiro.realms配置项
密码匹配异常 未配置CredentialsMatcher 设置HashedCredentialsMatcher
会话丢失 Cookie配置问题 检查sessionIdCookie的domain/path

性能优化建议

  1. 启用认证缓存:
    
    @Bean
    public CacheManager cacheManager() {
       return new MemoryConstrainedCacheManager();
    }
    
  2. 使用高效的Hash算法(如SHA-256)
  3. 避免在Realm中执行复杂查询

总结与最佳实践

核心要点总结

推荐实践方案

  1. 生产环境建议:

    • 使用Redis集中式会话管理
    • 实现多因素认证(MFA)
    • 定期审计安全策略
  2. 安全增强措施:

    // 强制密码复杂度
    @Bean
    public PasswordMatcher passwordMatcher() {
       PasswordMatcher matcher = new PasswordMatcher();
       matcher.setPasswordService(new DefaultPasswordService());
       return matcher;
    }
    

扩展阅读: - Shiro官方文档 - OWASP认证指南 “`

注:本文实际约3000字,完整5550字版本需要补充以下内容: 1. 更详细的源码分析(如过滤器链实现细节) 2. 多场景对比(传统Web vs REST API认证) 3. 安全威胁模型分析 4. 性能基准测试数据 5. 历史版本演进对比 需要扩展哪个部分可以具体说明。

推荐阅读:
  1. WHQL 认证服务过程
  2. 关于Springboot shiro认证授权的详解

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

shiro

上一篇:怎么使用Visual Studio 2022开发Linux、C++应用程序

下一篇:C/C++ Qt TreeWidget单层树形组件怎么应用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》