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: 用户实体
核心算法:
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 环境中,有两种选择:
- 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):
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 时需要注意以下安全事项:
- Realm 实现: 自定义 Realm 时需要确保安全查询的正确性
- 会话管理: 选择适合的会话管理方式,考虑安全性和性能
- 权限设计: 合理设计权限粒度,避免过度授权
- 配置安全: 确保配置文件的安全性,避免敏感信息泄露
7. 总结
Apache Shiro 通过清晰的架构设计和合理的模式应用,提供了一个强大而灵活的安全框架。理解其核心组件和它们之间的交互方式,对于有效使用 Shiro 和排查相关问题至关重要。特别是在 Web 环境中,需要注意 Shiro 与 Servlet 容器的集成方式和会话管理策略的选择。