Shiro框架

       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最重要的一个好处是它的绘画是独立于容器的

 登录认证

  1. 身份验证:一般需要提供如身份ID等一些标识信息来表明登录者的身份,如提供email,用户名/密码来证明。
  2. 在shiro中,用户需要提供principals(身份)和credentials(证明)给shiro,从而应用能验证用户身份
  3. principals:身份,即主体的标识属性,可以是任何属性,如用户名、邮箱等,唯一 即可。一个主体可以有多个principals,但只有一个Primary principals,一般是用户名/ 邮箱
  4. 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去执行

自定义登录认证方法

  1. 获取用户身份信息
  2. 调用业务层获取用户信息(数据库)
  3. 非空判断,将数据封装返回

多个 realm 的认证策略设置

当应用程序配置多个 Realm 时,例如:用户名密码校验、手机号验证码校验等等。
Shiro 的 ModularRealmAuthenticator 会使用内部的 AuthenticationStrategy 组件判断认
证是成功还是失败。
AuthenticationStrategy 是一个无状态的组件,它在身份验证尝试中被询问 4 次(这
4 次交互所需的任何必要的状态将被作为方法参数):
  1. 在所有 Realm 被调用之前
  2. 在调用 Realm 的 getAuthenticationInfo 方法之前
  3. 在调用 Realm 的 getAuthenticationInfo 方法之后
  4. 在所有 Realm 被调用之后认证策略的另外一项工作就是聚合所有 Realm 的结果信息封装至一个 AuthenticationInfo 实例中,并将此信息返回,以此作为 Subject 的身份信息。

 remember me 功能 

        Shiro 提供了记住我(RememberMe)的功能,比如访问一些网站时,关闭了浏览器,
下次再打开时还是能记住你是谁, 下次访问时无需再登录即可访问。

 

基本流程
  1. 首先在登录页面选中 RememberMe 然后登录成功;如果是浏览器登录,一般会把 RememberMe 的 Cookie 写到客户端并保存下来;
  2. 关闭浏览器再重新打开;会发现浏览器还是记住你的;
  3. 访问一般的网页服务器端,仍然知道你是谁,且能正常访问;
  4. 如果我们访问电商平台时,如果要查看我的订单或进行支付时,此时还是需要再进行身份认证的,以确保当前用户还是你。

授权、角色认证

用户登录后,需要验证是否具有指定角色指定权限。Shiro也提供了方便的工具进行判断,这个工具就是RealmdoGetAuthorizationInfo方法进行判断。触发权限判断的有两种方式

  1. 在页面中通过shiro:****属性判断
  2. 在接口服务中通过注解@Requires****进行判断 

后端接口服务注解

通过给接口服务方法添加注解可以实现权限校验,可以加在控制器方法上,也可以加
在业务方法上,一般加在控制器方法上。常用注解如下
@RequiresAuthentication:验证用户是否登录,等同于方法 subject.isAuthenticated()
@RequiresUser: 验证用户是否被记忆: 登录认证成功 subject.isAuthenticated() 为true,登录后被记忆 subject.isRemembered() true
@RequiresGuest: 验证是否是一个 guest 的请求,是否是游客的请求 此时 subject.getPrincipal() null
@RequiresRoles: 验证 subject 是否有相应角色,有角色访问方法,没有则会抛出异常 AuthorizationException

@RequiresPermissions:验证subject是否有相应权限,有权限访问方法,没有则会抛出异常AuthorizationException。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值