shiro-core 框架分析
字数 2539 2025-08-20 18:17:59

Apache Shiro-core 框架深度解析

1. 框架概述

Apache Shiro 是一个强大且易用的 Java 安全框架,提供身份验证、授权、加密和会话管理等功能。其核心设计理念是简化应用程序安全性的实现,同时保持足够的灵活性。

1.1 核心功能

Shiro-core 提供三大核心功能:

  • 身份验证(Authentication): 验证用户身份
  • 访问控制(Authorization): 控制用户权限
  • 会话管理(Session Management): 管理用户会话

1.2 核心架构

Shiro 的核心架构围绕以下几个关键组件构建:

  1. Subject: 代表当前执行用户的抽象,是 Shiro 的主要外部接口
  2. SecurityManager: 核心管理者,负责协调所有安全操作
  3. Authenticator: 负责身份认证
  4. Authorizer: 负责访问控制
  5. SessionManager: 负责会话管理
  6. Realm: 连接 Shiro 和安全数据源的桥梁

2. 核心组件详解

2.1 Subject

Subject 是 Shiro 的核心概念,代表当前与应用程序交互的实体(用户、第三方服务等)。

实现细节:

  • 默认实现类: DelegatingSubject
  • 内部类: Subject.Builder (使用 Builder 模式创建 Subject)
  • 存储信息: 身份信息(Principals)、认证状态(isAuthenticated)等

创建过程:

  1. 初始化 SubjectContext
  2. 调用 doCreateSubject(context) 方法
  3. 创建完成后,将当前 subject 的信息存储到会话中

2.2 SecurityManager

SecurityManager 是 Shiro 架构的核心,负责协调所有安全操作。

默认实现: DefaultSecurityManager

工作方式:

  • 采用委托模式,将大部分功能委托给其他组件:
    • Authenticator: 身份认证
    • Authorizer: 访问控制
    • SessionManager: 会话管理

2.3 Authenticator

负责验证用户提供的凭证(credentials)是否有效。

设计模式:

  • AOP (面向切面编程)思想
  • 策略模式
  • 工厂模式 (RealmFactory)

身份验证流程:

  1. Single Realm:
    • 根据 Principal 和 credentials 查询信息
    • 查得到则验证成功,否则失败
  2. Multi Realm:
    • 在 Single 基础上添加 AOP 操作
    • 实现类: ModularRealmAuthenticator

2.4 Authorizer

负责访问控制,即检查用户是否有权限执行特定操作。

授权元素:

  • Permission = Resource + Actions
  • Role: 权限的集合
  • User: 用户实体

核心算法:

protected boolean isPermitted(Permission permission, AuthorizationInfo info) {
    Collection<Permission> perms = getPermissions(info);
    if (perms != null && !perms.isEmpty()) {
        for (Permission perm : perms) {
            if (perm.implies(permission)) {
                return true;
            }
        }
    }
    return false;
}

只要用户拥有的权限集合中任意一个权限包含(implies)了所需权限,则授权成功。

2.5 SessionManager

管理用户会话,支持多种会话存储方式。

设计模式:

  • 监听模式
  • DAO 模式 (委托给 SessionDAO 进行 CRUD 操作)

实现方式:

  • 默认使用内存实现
  • 其他方式需要由应用程序自行实现
  • 在 Web 环境中,有两种选择:
    1. Shiro 原生会话管理
    2. Servlet 容器(如 Tomcat)实现的会话管理

2.6 Realms

作为连接 Shiro 和安全数据源的桥梁,负责:

  • 获取验证信息
  • 执行权限检查

特点:

  • Shiro 提供了一些简单实现
  • 通常需要应用程序根据业务需求自定义实现

3. 初始化流程

Shiro 的所有操作都从配置开始:

配置方式:

  1. 编程式配置
  2. 配置文件读取与解析 (利用反射机制调用构造函数、setter/getter)

初始化对象:

  • 主要初始化 SecurityManager
  • 其他组件通过委托方式由 SecurityManager 管理

4. 设计模式应用

Shiro 中广泛应用了多种设计模式:

  1. Builder 模式: 用于创建 Subject
  2. 工厂模式: 如 SubjectFactory, RealmFactory
  3. 委托模式: SecurityManager 将功能委托给各组件
  4. 策略模式: 在不同场景下使用不同的认证/授权策略
  5. AOP 思想: 将安全逻辑与业务逻辑解耦

5. Shiro-Web 集成

shiro-webshiro-core 的包装器(wrapper),主要特征是实现一方,调用一方。

关键点:

  • 实现了 Filter 接口,使 Tomcat 可以调用
  • ShiroFilter 调用 WebSubject
  • 与 Servlet 容器的关系不是单向的,存在双向调用
  • 会话管理可以选择使用 Shiro 原生实现或 Servlet 容器实现

会话管理冲突解决方案:

  • WebSessionManager 的两种实现:
    1. Native: 使用 Shiro 自己实现的会话管理
    2. ServletContainer: 调用 Servlet 容器实现的会话管理

示例代码 (ServletContainerSessionManager):

public Session getSession(SessionKey key) throws SessionException {
    if (!WebUtils.isHttp(key)) {
        throw new IllegalArgumentException("SessionKey must be an HTTP compatible implementation.");
    }
    HttpServletRequest request = WebUtils.getHttpRequest(key);
    Session session = null;
    HttpSession httpSession = request.getSession(false);
    if (httpSession != null) {
        session = createSession(httpSession, request.getRemoteHost());
    }
    return session;
}

6. 安全考量

在使用 Shiro 时需要注意以下安全事项:

  1. Realm 实现: 自定义 Realm 时需要确保安全查询的正确性
  2. 会话管理: 选择适合的会话管理方式,考虑安全性和性能
  3. 权限设计: 合理设计权限粒度,避免过度授权
  4. 配置安全: 确保配置文件的安全性,避免敏感信息泄露

7. 总结

Apache Shiro 通过清晰的架构设计和合理的模式应用,提供了一个强大而灵活的安全框架。理解其核心组件和它们之间的交互方式,对于有效使用 Shiro 和排查相关问题至关重要。特别是在 Web 环境中,需要注意 Shiro 与 Servlet 容器的集成方式和会话管理策略的选择。

Apache Shiro-core 框架深度解析 1. 框架概述 Apache Shiro 是一个强大且易用的 Java 安全框架,提供身份验证、授权、加密和会话管理等功能。其核心设计理念是简化应用程序安全性的实现,同时保持足够的灵活性。 1.1 核心功能 Shiro-core 提供三大核心功能: 身份验证(Authentication) : 验证用户身份 访问控制(Authorization) : 控制用户权限 会话管理(Session Management) : 管理用户会话 1.2 核心架构 Shiro 的核心架构围绕以下几个关键组件构建: Subject : 代表当前执行用户的抽象,是 Shiro 的主要外部接口 SecurityManager : 核心管理者,负责协调所有安全操作 Authenticator : 负责身份认证 Authorizer : 负责访问控制 SessionManager : 负责会话管理 Realm : 连接 Shiro 和安全数据源的桥梁 2. 核心组件详解 2.1 Subject Subject 是 Shiro 的核心概念,代表当前与应用程序交互的实体(用户、第三方服务等)。 实现细节 : 默认实现类: DelegatingSubject 内部类: Subject.Builder (使用 Builder 模式创建 Subject) 存储信息: 身份信息(Principals)、认证状态(isAuthenticated)等 创建过程 : 初始化 SubjectContext 调用 doCreateSubject(context) 方法 创建完成后,将当前 subject 的信息存储到会话中 2.2 SecurityManager SecurityManager 是 Shiro 架构的核心,负责协调所有安全操作。 默认实现 : DefaultSecurityManager 工作方式 : 采用 委托模式 ,将大部分功能委托给其他组件: Authenticator : 身份认证 Authorizer : 访问控制 SessionManager : 会话管理 2.3 Authenticator 负责验证用户提供的凭证(credentials)是否有效。 设计模式 : AOP (面向切面编程)思想 策略模式 工厂模式 ( RealmFactory ) 身份验证流程 : Single Realm : 根据 Principal 和 credentials 查询信息 查得到则验证成功,否则失败 Multi Realm : 在 Single 基础上添加 AOP 操作 实现类: ModularRealmAuthenticator 2.4 Authorizer 负责访问控制,即检查用户是否有权限执行特定操作。 授权元素 : Permission = Resource + Actions Role : 权限的集合 User : 用户实体 核心算法 : 只要用户拥有的权限集合中任意一个权限 包含(implies) 了所需权限,则授权成功。 2.5 SessionManager 管理用户会话,支持多种会话存储方式。 设计模式 : 监听模式 DAO 模式 (委托给 SessionDAO 进行 CRUD 操作) 实现方式 : 默认使用内存实现 其他方式需要由应用程序自行实现 在 Web 环境中,有两种选择: Shiro 原生会话管理 Servlet 容器(如 Tomcat)实现的会话管理 2.6 Realms 作为连接 Shiro 和安全数据源的桥梁,负责: 获取验证信息 执行权限检查 特点 : Shiro 提供了一些简单实现 通常需要应用程序根据业务需求自定义实现 3. 初始化流程 Shiro 的所有操作都从配置开始: 配置方式 : 编程式配置 配置文件读取与解析 (利用反射机制调用构造函数、setter/getter) 初始化对象 : 主要初始化 SecurityManager 其他组件通过委托方式由 SecurityManager 管理 4. 设计模式应用 Shiro 中广泛应用了多种设计模式: Builder 模式 : 用于创建 Subject 工厂模式 : 如 SubjectFactory , RealmFactory 委托模式 : SecurityManager 将功能委托给各组件 策略模式 : 在不同场景下使用不同的认证/授权策略 AOP 思想 : 将安全逻辑与业务逻辑解耦 5. Shiro-Web 集成 shiro-web 是 shiro-core 的包装器(wrapper),主要特征是实现一方,调用一方。 关键点 : 实现了 Filter 接口,使 Tomcat 可以调用 ShiroFilter 调用 WebSubject 与 Servlet 容器的关系不是单向的,存在双向调用 会话管理可以选择使用 Shiro 原生实现或 Servlet 容器实现 会话管理冲突解决方案 : WebSessionManager 的两种实现: Native: 使用 Shiro 自己实现的会话管理 ServletContainer: 调用 Servlet 容器实现的会话管理 示例代码 ( ServletContainerSessionManager ): 6. 安全考量 在使用 Shiro 时需要注意以下安全事项: Realm 实现 : 自定义 Realm 时需要确保安全查询的正确性 会话管理 : 选择适合的会话管理方式,考虑安全性和性能 权限设计 : 合理设计权限粒度,避免过度授权 配置安全 : 确保配置文件的安全性,避免敏感信息泄露 7. 总结 Apache Shiro 通过清晰的架构设计和合理的模式应用,提供了一个强大而灵活的安全框架。理解其核心组件和它们之间的交互方式,对于有效使用 Shiro 和排查相关问题至关重要。特别是在 Web 环境中,需要注意 Shiro 与 Servlet 容器的集成方式和会话管理策略的选择。