Gemini永久会员 Shiro是一个功能强大且易于使用的Java安全框架,提供了认证、授权、加密和会话管理等功能
Shiro是一个功能强大且易于使用的Java安全框架,提供了认证、授权、加密和会话管理等功能,以下是对其核心用法及关键组件的详细介绍:
一、核心组件
- 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文件或数据库等方式配置用户信息、角色信息和权限信息。
- 添加依赖:在项目的pom.xml文件中添加Shiro的依赖,如
- 登录认证
- 收集用户身份、凭证(如用户名、密码)。
- 调用
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类进行加密操作,可以指定加密算法、盐值、迭代次数等参数。
三、示例代码
- 登录认证示例
importorg.apache.shiro.SecurityUtils;importorg.apache.shiro.authc.AuthenticationException;importorg.apache.shiro.authc.UsernamePasswordToken;importorg.apache.shiro.config