核心组件
- Subject(主体):代表当前操作的'用户',可能是实际用户、程序或定时任务等。通过
SecurityUtils.getSubject() 获取当前 Subject,所有安全操作(如登录、权限校验)都通过 Subject 触发。
- SecurityManager(安全管理器):Shiro 的'大脑',负责协调所有安全组件(认证、授权、会话等),是 Shiro 的核心调度中心。开发者无需直接操作 SecurityManager,只需通过 Subject 间接调用其功能。
- Realm(领域):Shiro 的'数据源接口',负责从数据库、缓存、配置文件等地方获取用户信息(如账号密码、权限列表)。认证时,Realm 提供用户的真实凭证;授权时,Realm 提供用户的权限集合。自定义 Realm 是 Shiro 灵活适配业务的关键。
- Authenticator(认证器):对用户登录时进行身份认证,验证用户提供的凭证是否与系统存储的凭证一致。
- Authorizer(授权器):用户通过认证器认证通过后,在访问功能时需要通过授权器判断用户是否有此功能的操作权限。
- SessionManager(会话管理器):管理用户会话的组件,适用于 Web 以及非 Web 的环境。
- CacheManager(缓存管理器):管理用户身份、权限、角色等的缓存,以提高访问性能。
- Cryptography(加密管理器):提供加密方式的设计及管理,保护数据的安全性。
基本用法
- 环境搭建
- 添加依赖:在项目的 pom.xml 文件中添加 Shiro 的依赖,如
shiro-core、shiro-web 等。
- 配置文件:可以通过 INI 文件、XML 文件或数据库等方式配置用户信息、角色信息和权限信息。
- 登录认证
- 收集用户身份、凭证(如用户名、密码)。
- 调用
Subject.login 方法进行登录,如果失败将得到相应的 AuthenticationException 异常,根据异常提示用户错误信息;否则登录成功。
- 创建自定义的 Realm 类,继承
org.apache.shiro.realm.AuthenticatingRealm 类,实现 doGetAuthenticationInfo() 方法,用于从数据源中获取用户信息进行认证。
- 角色授权
- 定义角色和权限:在配置文件中或通过编程方式定义角色和权限。
- 检查用户角色:使用
Subject.hasRole() 方法检查用户是否拥有某个角色。
- 自定义 Realm 授权:继承
org.apache.shiro.realm.AuthorizingRealm 类,实现 doGetAuthorizationInfo() 方法,用于从数据源中获取用户角色信息进行授权。
- 权限授权
- 定义权限:权限通常表示为'资源:操作'的格式,如'user:add'表示新增用户的权限。
- 检查用户权限:使用
Subject.isPermitted() 方法检查用户是否拥有某个权限。
- 加密解密
- Shiro 提供了多种加密算法,如 MD5、SHA 等,用于密码加密存储到数据库,而不是明文存储。
- 使用
SimpleHash 类进行加密操作,可以指定加密算法、盐值、迭代次数等参数。
示例代码
- 登录认证示例
import org.apache.shiro.SecurityUtils;
org.apache.shiro.authc.AuthenticationException;
org.apache.shiro.authc.UsernamePasswordToken;
org.apache.shiro.config