美文网首页shiro
AuthenticationStrategy认证策略

AuthenticationStrategy认证策略

作者: 抓兔子的猫 | 来源:发表于2016-12-21 13:55 被阅读385次

    如果是多个Realm,ModularRealmAuthenticator将会根据认证策略来确定认证是否成功。

    例如,如果只有一个Realm验证成功,而其他Realm验证失败,那么这次认证是否成功呢?如果大多数的Realm验证成功了,认证是否就认为成功呢?或者,一个Realm验证成功后,是否还需要判断其他Realm的结果?认证策略就是根据应用程序的需要对这些问题作出决断。

    AuthenticationStrategy 是个无状态的组件,在认证过程中会进行4次调用。

    1.在所有Realm被调用之前
    2.在调用Realm的getAuthenticationInfo方法之前
    3.在调用Realm的getAuthenticationInfo 方法之后
    4.在所有Realm被调用之后

    
            protected AuthenticationInfo doMultiRealmAuthentication(Collection<Realm> realms, AuthenticationToken token) {
    
            AuthenticationStrategy strategy = getAuthenticationStrategy();
            //1*
            AuthenticationInfo aggregate = strategy.beforeAllAttempts(realms, token);
    
            if (log.isTraceEnabled()) {
                log.trace("Iterating through {} realms for PAM authentication", realms.size());
            }
    
            for (Realm realm : realms) {
              //2*
                aggregate = strategy.beforeAttempt(realm, token, aggregate);
    
                if (realm.supports(token)) {
    
                    log.trace("Attempting to authenticate token [{}] using realm [{}]", token, realm);
    
                    AuthenticationInfo info = null;
                    Throwable t = null;
                    try {
                        info = realm.getAuthenticationInfo(token);
                    } catch (Throwable throwable) {
                        t = throwable;
                        if (log.isDebugEnabled()) {
                            String msg = "Realm [" + realm + "] threw an exception during a multi-realm authentication attempt:";
                            log.debug(msg, t);
                        }
                    }
                    //3*
                    aggregate = strategy.afterAttempt(realm, token, info, aggregate, t);
    
                } else {
                    log.debug("Realm [{}] does not support token {}.  Skipping realm.", realm, token);
                }
            }
             //4*
            aggregate = strategy.afterAllAttempts(token, aggregate);
    
            return aggregate;
        }
    

    认证策略的另外一项工作就是聚合所有Realm的结果信息封装至一个AuthenticationInfo实例中,并将此信息返回,以此作为Subject的身份信息。

    Shiro有3中认证策略的具体实现
    AuthenticationStrategy类:

    AtLeastOneSuccessfulStrategy(默认)
    只要一个或者多个Realm认证通过,则整体身份认证就会视为成功。

    FirstSuccessfulStrategy
    只有第一个验证通过,才会视为整体认证通过。其他的会被忽略。

    AllSuccessfulStrategy
    只有所有的Realm认证成功,才会被视为认证通过。

    自定义策略:继承org.apache.shiro.authc.pam.AbstractAuthenticationStrategy。
    Realm的顺序
    Realm顺序对认证是有影响的。

    默认顺序是按照定义的顺序,例如配置文件 中这样配置:

    #自定义realm  
    myRealm1 = com.api6.shiro.demo1.Realm.UserRealm1  
    myRealm2 = com.api6.shiro.demo1.Realm.UserRealm2  
    #指定realm的顺序  
    securityManager.realms  = $myRealm1,$myRealm2  
    #策略  
    #authcStrategy = org.apache.shiro.authc.pam.FirstSuccessfulStrategy  
    #authcStrategy = org.apache.shiro.authc.pam.AllSuccessfulStrategy  
    authcStrategy = org.apache.shiro.authc.pam.AtLeastOneSuccessfulStrategy  
    securityManager.authenticator.authenticationStrategy = $authcStrategy< 
    

    那么将会按照 myRealm1,myRealm2 的顺序依次调用。

    参照:http://blog.csdn.net/lishehe/article/details/45219023

    相关文章

      网友评论

        本文标题:AuthenticationStrategy认证策略

        本文链接:https://www.haomeiwen.com/subject/sikqvttx.html