Shiro是一个功能强大且易于使用的JAVA安全权限框架,Shiro可以完成:认证、授权、加密、会话管理、与Web集成、缓存等。
Shiro特性:易于使用,全面,灵活,强力支持Web,兼容性强,社区支持。
Shiro和SpringSecurity的对比
- Spring Security基于Spring开发,项目使用Spring作为基础的前提下,配合Spring Security做权限更加方便,而Shrio需要和Spring进行整合开发。
- Spring Security在安全维护方面功能比Shiro更加丰富
- Spring Security的社区资源相比较于Shiro更加丰富
- Shiro配置和使用更加简单,而Spring Security上手更加复杂
- Shiro依赖性低,不需要任何的框架和容器,可以独立运行。Spring Security则需要依赖Spring容器
- Shiro不仅仅可以使用在web中,他可以工作在任何应用环境中。在集群会话时,Shiro最重要的一个好处是它的绘画是独立于容器的
登录认证
- 身份验证:一般需要提供如身份ID等一些标识信息来表明登录者的身份,如提供email,用户名/密码来证明。
- 在shiro中,用户需要提供principals(身份)和credentials(证明)给shiro,从而应用能验证用户身份
- principals:身份,即主体的标识属性,可以是任何属性,如用户名、邮箱等,唯一 即可。一个主体可以有多个principals,但只有一个Primary principals,一般是用户名/ 邮箱
- credentials:证明/凭证,即只有主体知道的安全值,如密码/数字证书等。
最常见的principals和credentials组合就是用户名/密码
//1 初始化获取 SecurityManager //2 获取 Subject 对象 //3 创建 token 对象,web 应用用户名密码从页面传递 //4 完成登录
Shiro核心组件
用户,角色,权限
会给角色赋予权限,给用户赋予角色
UsernamePasswordToken,Shiro用来封装用户登录信息,使用用户登录信息来创建令牌Token
SecuroityManager,Shiro的和信心部分,负责安全认证和授权
Subject,shiro的一个抽象概念,包含了用户信息
Realm,开发者自定义的模块,根据项目需求,验证和授权逻辑全部写在Realm中
AuthenticationInfo,用户的角色信息集合,认证时使用
AuthorzationInfo,角色的权限信息,授权时使用
DefaultWebSecurityManager,安全管理器,开发者自定义的Realm,需要注入到DefaultWebSecurityManager中进行管理才能使用
ShiroFilterFactoryBean,过滤器工厂
开发者定制规则,Shiro去执行
自定义登录认证方法
-
获取用户身份信息
-
调用业务层获取用户信息(数据库)
-
非空判断,将数据封装返回
多个 realm 的认证策略设置
- 在所有 Realm 被调用之前
- 在调用 Realm 的 getAuthenticationInfo 方法之前
- 在调用 Realm 的 getAuthenticationInfo 方法之后
- 在所有 Realm 被调用之后认证策略的另外一项工作就是聚合所有 Realm 的结果信息封装至一个 AuthenticationInfo 实例中,并将此信息返回,以此作为 Subject 的身份信息。
remember me 功能
- 首先在登录页面选中 RememberMe 然后登录成功;如果是浏览器登录,一般会把 RememberMe 的 Cookie 写到客户端并保存下来;
- 关闭浏览器再重新打开;会发现浏览器还是记住你的;
- 访问一般的网页服务器端,仍然知道你是谁,且能正常访问;
- 如果我们访问电商平台时,如果要查看我的订单或进行支付时,此时还是需要再进行身份认证的,以确保当前用户还是你。
授权、角色认证
用户登录后,需要验证是否具有指定角色指定权限。Shiro也提供了方便的工具进行判断,这个工具就是Realm的doGetAuthorizationInfo方法进行判断。触发权限判断的有两种方式
- 在页面中通过shiro:****属性判断
- 在接口服务中通过注解@Requires****进行判断
后端接口服务注解
@RequiresPermissions:验证subject是否有相应权限,有权限访问方法,没有则会抛出异常AuthorizationException。