Shiro第二章Authentication


  • authentication認證

    認證(Authentication):身份驗證的過程--也就是證明一個用戶的真實身份。為了證明用戶身份,需要提供系統理解和相信的身份信息和證據。
    需要通過向 Shiro 提供用戶的身份(principals)和證明(credentials )來判定是否和系統所要求的匹配。
    Principals(身份) 是Subject的“標識屬性”,可以是任何與Subject相關的標識
    Credentials(證明) 通常是只有 Subject 知道的機密內容,用來證明他們真正擁有所需的身份,一些簡單的證書例子如密碼、指紋、眼底掃描和X.509證書等

  • Authenticating Subjects

    Subject 驗證的過程可以有效地划分分以下三個步驟:

    1.收集 Subject 提交的身份和證明;

    //最常用的情況是 username/password 對:
    UsernamePasswordToken token = new UsernamePasswordToken(username, password);
    //”Remember Me” 功能是內建的
    token.setRememberMe(true);


    2.向 Authentication 提交身份和證明;

    Subject currentUser = SecurityUtils.getSubject();
    currentUser.login(token);

    3.如果提交的內容正確,允許訪問,否則重新嘗試驗證或阻止訪問

    try {
        currentUser.login(token);
    } catch ( UnknownAccountException uae ) { ...
    } catch ( IncorrectCredentialsException ice ) { ...
    } catch ( LockedAccountException lae ) { ...
    } catch ( ExcessiveAttemptsException eae ) { ...
    } ... 捕獲你自己的異常 ...
    } catch ( AuthenticationException ae ) {
        //未預計的錯誤?
    }

    Remembered vs. Authenticated
    記住的(Remembered):一個被記住的 Subject 不會是匿名的,擁有一個已知的身份(也就是說subject.getPrincipals())返回非空)。它的身份被先前的認證過程所記住,並存於先前session中,一個被認為記住的對象在執行subject.isRemembered())返回true。
    已驗證(Authenticated):一個被驗證的 Subject 是成功驗證后(如登錄成功)並存於當前 session 中,一個被認為驗證過的對象調用subject.isAuthenticated()) 將返回true
    remembered和authentication是互斥的

    Logging Out

    currentUser.logout(); //清除驗證信息,使 session 失效

    Authentication Sequence 認證順序

    第1步:應用程序代碼調用該Subject.login方法,並傳入AuthenticationToken表示最終用戶的主體和憑據的構造實例。
    第2步:Subject 實例,通常是一個 DelegatingSubject(或其子類)通過調用 securityManager.login(token )將這個令牌轉交給程序的 SecurityManager。
    第3步:SecurityManager,基本的“安全傘”組件,得到令牌並通過調用 authenticator.authenticate(token))簡單地將其轉交它內部的 Authenticator 實例,大部分情況下是一個 ModularRealmAuthenticator 實例,用來支持在驗證過程中協調一個或多個Realm實例。
    第4步:如程序配置了多個 Realm,ModularRealmAuthenticator實例將使用其配置的 AuthenticationStrategy 開始一個 多 Realm 身份驗證的嘗試。在 Realm 被驗證調用的整個過程中,AuthenticationStrategy(安全策略)被調用用來回應每個Realm結果(
    如果僅有一個 Realm 被配置,它直接被調用--在單 Realm 程序中不需要AuthenticationStrategy
    第5步:每一個配置的 Realm 都被檢驗看其是否支持提交的AuthenticationToken,如果支持,則該 Realm 的 getAuthenticationInfo 方法隨着提交的牌被調用,getAuthenticationInfo 方法為特定的 Realm 有效提供一次獨立的驗證嘗試

 

AuthenticationStrategy認證策略

AuthenticationStrategyclass Description
AtLeastOneSuccessfulStrategy 如果有一個或多個Realm驗證成功,所有的嘗試都被認為是成功的,如果沒有一個驗證成功,則該次嘗試失敗
FirstSuccessfulStrategy 只有從第一個成功驗證的Realm返回的信息會被使用,以后的Realm將被忽略,如果沒有一個驗證成功,則該次嘗試失敗
AllSuccessfulStrategy 所有配置的Realm在全部嘗試中都成功驗證才被認為是成功,如果有一個驗證不成功,則該次嘗試失敗。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM