zoukankan      html  css  js  c++  java
  • 【Shiro】三、Apache Shiro认证

    配置好并获取到SecurityManager,代表Shiro正常运行起来了,可以使用Shiro的其它功能。

    1、认证流程(API的使用流程)

     认证的数据:

      Principals:标识

      ·识别Subject的数据

      ·如:用户名、身份证号等

      ·Primary Principal:Subject唯一主编号

      Credentials:凭证

      ·Subject私密数据

      ·如:密码、指纹、视网膜等

    认证的步骤:

      收集数据→提交验证→结果处理

      收集数据方式:

        1、自行实现Shiro的AuthenticationToken接口

        2、使用Shiro提供的一些默认AuthenticationToken接口实现,如UsernamePasswordToken实现

      提交验证:

        Subject代表当前用户,调用Subject的登录方法Subject.login()

      结果处理

        成功:使用Subject的isAuthenticated()方法查看

        失败:抛出异常,可以捕获异常进行处理。

      认证的代码示例:

    //收集数据
    UsernamePasswordToken token = 
        new UsernamePasswordToken(username,password);
    token.setRememberMe(true);//默认实现提供的一些辅助功能
    
    //提交验证
    Subject currentUser = SecurityUtils.getSubject(); 
    currentUser.login(token);
    
    //验证是否成功
    Subject loginUser = SecutiryUtils.getSubject(); 
    loginUser.isAuthenticated() == true;
    
    //登录失败时处理异常
    try{
        currentUser.login(token);
    } catch ( ExType1 ex1){
    } catch ( ExType2 ex2){
    } catch ( ExType3 ex3){
    }....

    Remember Me

    Remembered

      ·认证信息非空

      ·认证信息来自上一个Session的认证结果

      ·subject.isRememebered() = true 判断上次是否使用RememberMe

    Authenticated

      ·认证信息来自当前Session的认证结果

      ·subject.isAuthenticated() = true 判断本次认证是否通过

    使用场景:

      商城购物车

      1、上次登录了,这次开启浏览器未登录,想把一个货品加入到购物车(如果此时要求先登录,用户体验不好,现在的网站都是可以先加入购物车,然后付款时再登录付款的)

      这时候,使用isRememebered(),获取上次的认证信息,把购物车数据直接存到上次认证的用户中。

      2、需要下单付款了

      此时再要求登录,然后使用isAuthenticated(),确定本次登录的用户是否正确。

    Loggin out

    //使Session无效,清空所有认证信息
    currentUser.logout();

    2、认证架构(框架的内部运作)

    1、调用Subject.login(token)方法

    2、找Security Manager(门面模式)

    3、调用Authenticator组件

    4、组件中有很多策略,这些策略会调用Realm获取数据,最终用来判断是否通过验证

    5、通过Realm访问数据库等获取数据,用于判断是否通过认证

    Authenticator

    单个Realm

      ModularRealmAuthenticator:仅有一个Realm,仅通过这个Realm就可以知道是否通过认证

    多个Realm

      AuthenticationStrategy:当有多个Realm时,通过某种策略去判断怎样才算认证通过

    自定义Authenticator

      当上面都无法满足的时候,我们可以自定义实现一个Authenticator

      然后如下面代码一样,把这个Authenticator赋值给Security Manager即可

    [main]
    ...
    authenticator = com.foo.bar.CustomAuthenticator
    
    securityManager.authenticator = $authenticator

    AuthenticationStrategy

    AtLeastOneSuccessfulStrategy[默认值]

      只要有一个Realm验证成功即可,返回所有Realm身份验证成功的认证信息。

    FirstSuccessfulStrategy

      只要有一个Reaml验证成功即可,只返回第一个Reaml身份验证成功的认证信息,其它忽略。

    AllSuccessfulStrategy

      所有Realm验证成功才算成功,切返回所有Realm身份验证成功的认证信息,如果有一个失败就失败。

    [main]
    ...
    authcStrategy = org.apache.shiro.authc.pam.FirstSuccessfulStrategy
    
    securityManager.authenticator.authenticationStrategy = $authcStrategy 

    Realm认证顺序

    多个Realm认证顺序

      迭代认证

    隐式顺序

      按照配置书写代码的顺序来认证

    blahRealm = com.company.blah.Realm
    fooRealm = com.company.foo.Realm
    barRealm = com.company.another.Realm

    显式顺序

      使用securityManager.realms

    blahRealm = com.company.blah.Realm
    fooRealm = com.company.foo.Realm
    barRealm = com.company.another.Realm
    securityManager.realms = $fooRealm,$barRealm,$blahRealm
  • 相关阅读:
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    Rng(求逆元)
    P1306 斐波那契公约数(ksm+结论)
    sort(桶排序+hash)
    牛客多校训练AFJ(签到)
    Educational Codeforces Round 68 (Rated for Div. 2)-D. 1-2-K Game
    Educational Codeforces Round 68 (Rated for Div. 2)-C-From S To T
    The Unique MST(最小生成树的唯一性判断)
    飞跃原野(三维bfs)
  • 原文地址:https://www.cnblogs.com/LiveYourLife/p/9092587.html
Copyright © 2011-2022 走看看