AuthenticationStrategy認(rèn)證策略

如果是多個(gè)Realm,ModularRealmAuthenticator將會(huì)根據(jù)認(rèn)證策略來確定認(rèn)證是否成功。

例如,如果只有一個(gè)Realm驗(yàn)證成功,而其他Realm驗(yàn)證失敗,那么這次認(rèn)證是否成功呢?如果大多數(shù)的Realm驗(yàn)證成功了,認(rèn)證是否就認(rèn)為成功呢?或者,一個(gè)Realm驗(yàn)證成功后,是否還需要判斷其他Realm的結(jié)果?認(rèn)證策略就是根據(jù)應(yīng)用程序的需要對這些問題作出決斷。

AuthenticationStrategy 是個(gè)無狀態(tài)的組件,在認(rèn)證過程中會(huì)進(jìn)行4次調(diào)用。

1.在所有Realm被調(diào)用之前
2.在調(diào)用Realm的getAuthenticationInfo方法之前
3.在調(diào)用Realm的getAuthenticationInfo 方法之后
4.在所有Realm被調(diào)用之后


        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;
    }

認(rèn)證策略的另外一項(xiàng)工作就是聚合所有Realm的結(jié)果信息封裝至一個(gè)AuthenticationInfo實(shí)例中,并將此信息返回,以此作為Subject的身份信息。

Shiro有3中認(rèn)證策略的具體實(shí)現(xiàn)
AuthenticationStrategy類:

AtLeastOneSuccessfulStrategy(默認(rèn))
只要一個(gè)或者多個(gè)Realm認(rèn)證通過,則整體身份認(rèn)證就會(huì)視為成功。

FirstSuccessfulStrategy
只有第一個(gè)驗(yàn)證通過,才會(huì)視為整體認(rèn)證通過。其他的會(huì)被忽略。

AllSuccessfulStrategy
只有所有的Realm認(rèn)證成功,才會(huì)被視為認(rèn)證通過。

自定義策略:繼承org.apache.shiro.authc.pam.AbstractAuthenticationStrategy。
Realm的順序
Realm順序?qū)φJ(rèn)證是有影響的。

默認(rèn)順序是按照定義的順序,例如配置文件 中這樣配置:

#自定義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< 

那么將會(huì)按照 myRealm1,myRealm2 的順序依次調(diào)用。

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 身份驗(yàn)證,即在應(yīng)用中誰能證明他就是他本人。一般提供如他們的身份ID一些標(biāo)識(shí)信息來表明他就是他本人,如提供身份證,用...
    小孩真笨閱讀 607評論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,628評論 19 139
  • 銀行開戶的身份驗(yàn)證 怎么驗(yàn)證一個(gè)人就是他本人呢?比如我去銀行里開一個(gè)賬戶,辦一張卡,那就需要我本人,帶著自己的身份...
    geoeee閱讀 863評論 0 1
  • 很多人品嘗傳說中的美食,都會(huì)經(jīng)過這個(gè)步驟, 吃完一道美食,就迫不及待去尋找下一道。 如果你是一道菜?你希望你是...
    嘎嘣六三三閱讀 11,162評論 2 4
  • 標(biāo)簽: 設(shè)計(jì)模式初涉 描述性文字 本節(jié)講解的是行為型設(shè)計(jì)模式種的:命令模式,該模式非常簡單,就是用于行為請求者與行...
    coder_pig閱讀 291評論 0 0

友情鏈接更多精彩內(nèi)容