修🐶的家

总有一条蜿蜒在童话镇里七彩的河

  menu
50 文章
0 浏览
1 当前访客
ღゝ◡╹)ノ❤️

Shiro

认证流程

截屏2023060801.36.28.png

  1. 创建token令牌 ,token中有用户提交的认证信息即帐号和密码
  2. 执行Subject.login(token) ,Subject实例通常是DelegatingSubject类(或子类)的实例对象;在认证开始时,通过SecurityManager实例来调用securityManager.login(token)方法
  3. SecurityManager接受到token(令牌)信息后 委托Authenticator实例进行认证 ;Authenticator通过实现类 ModularRealmAuthenticator来调用anthenticator.authenticate(token)方法 ;ModularRealmAuthenticator在认证过程中会对一个或多个Realm实例进行适配(可插拔)
  4. 如果配置了多个Realm,ModularRealmAuthenticator会根据配置的 AuthenticationStrategy(认证策略) 来进行 多Realm的认证过程 ;在Realm被调用后,AuthenticationStrategy将对每一个Realm的结果做出响应
    注意:如果只有一个Realm,Realm将直接调用而无需再配置认证策略
  5. 判断每一个Realm是否都支持提交的token ,如果支持,Realm调用 getAuthenticationInfo(token) ,该方法就是实际的认证处理,我们通过覆盖Realm的doGetAuthenticationInfo方法来编写我们自定义的认证处理
  6. shiro中有三种认证策略的具体实现:
  7. AtleastOneSuccessfulStrategy: 只要有一个realm验证成功,则成功
  8. FirstSuccessfulStrategy: 第一个realm验证成功,则成功,后续realm将被忽略
  9. AllSuccessfulStrategy: 所有realm成功,验证才成功

补充:认证失败后抛出的一些异常:

· **UnknownAccountException ** 帐号不存在

· IncorrectCredentialsException  密码错误

· DisabledAccountException   帐号被禁用

· LockedAccountException  帐号被锁定

· ExcessiveAttemptsException  登录失败次数过多

· ExpiredCredentialsException  凭证过期

 

自定义Realm

shiro自带的Realm接口,CachingRealm负责缓存处理,AuthenticationRealm负责认证,AuthorizingRealm负责授权等,但是通常情况下,正确的用户信息都是从数据库中取出,所以需要自定义realm,通常自定义的realm继承 AuthorizingRealm ,认证是重写 doGetAuthenticationInfo(AuthenticationToken token) 方法,授权是重写 doGetAuthorizationInfo(PrincipalCollection principals) 方法

 

授权流程

截屏2023060801.36.42.png

  1. 调用授权验证方法Subject.isPermitted()Subject.hasRole() 等)
  2. Subject实例通常是DelegatingSubject类(或子类)的实例对象;在认证开始时,通过SecurityManager实例来调用 securityManager.isPermitted(string) 方法/ security.hasRole(string) 方法
  3. SecurityManager委托Authorizer的实例调用相应的授权方法
  4. 每一个Realm将检查是否实现了相同的Authorizer接口,然后调用Realm自己的相应的授权验证方法
  5. 使用多个Realm时,不同于认证策略处理方式,授权处理过程中:

· 当调用Realm出现异常时,立即抛出,结束授权验证

· 只要一个Realm验证成功,则认为授权成功,立即返回,结束验证

     1.简介      

        常用的Java EE安全框架有shiro、spring security。shiro被应用非常广泛,可以集成cas,搭建单点登录系统。spring security则被认为比较重,应用没有shiro广泛。shiro提供用户名、密码验证,及密码的加密存储,会话Session的管理,与web集成,支持HTTPS的拦截。

  2.Shiro原理简析

shiro原理剖析:

         shiro的核心是java servlet规范中的filter,通过配置拦截器,使用拦截器链来拦截请求,如果允许访问,则通过。通常情况下,系统的登录、退出会配置拦截器。登录的时候,调用subject.login(token),token是用户验证信息,这个时候会在Realm中doGetAuthenticationInfo方法中进行认证。这个时候会把用户提交的验证信息与数据库中存储的认证信息进行比较,一致则允许访问,并在浏览器种下此次回话的cookie,在服务器端存储session信息。退出的时候,调用subject.logout(),会清除回话信息。

      Realm:

               表示验证的数据源,存储用户的安全数据,可以进行用户名和密码的匹配,及用户权限查询。


标题:Shiro
作者:hanmoonhan
地址:https://www.hanmoonhan.club/articles/2023/04/23/1682257409616.html