<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 7. Realms # 7. Realms Realm 是可以訪問程序特定的安全數據如用戶、角色、權限等的一個組件。Realm 會將這些程序特定的安全數據轉換成一種 Shiro 可以理解的形式,Shiro 就可以依次提供容易理解的 [Subject](../IV.%20Auxiliary%20Support%20%E8%BE%85%E5%8A%A9%E6%94%AF%E6%8C%81/14.%20Custom%20Subjects%20%E8%87%AA%E5%AE%9A%E4%B9%89%20Subject.md) 程序API而不管有多少數據源或者程序中你的數據如何組織。 Realm 通常和數據源是一對一的對應關系,如關系數據庫,LDAP 目錄,文件系統,或其他類似資源。因此,Realm 接口的實現使用數據源特定的API 來展示授權數據(角色,權限等),如JDBC,文件IO,Hibernate 或JPA,或其他數據訪問API。 *Realm 實質上就是一個特定安全的 [DAO](http://en.wikipedia.org/wiki/Data_Access_Object)* 因為這些數據源大多通常存儲身份驗證數據(如密碼的憑證)以及授權數據(如角色或權限),每個 Shiro Realm 能夠執行身份驗證和授權操作。 ## Realm Configuration 如果使用 Shiro 的 ini 配置文件,你可以在\[main\]區域內像配置其它對象一樣定義和引用Realms,但是 Realm 在 secrityManager上的配置有兩種方式:明確方式和隱含方式。 ### Explicit Assignment 明確指定(顯式) 在迄今所知的INI配置文件的相關知識中,這是一種顯示的配置方式。在定義一個或多個Realm后,再將它們在securityManager上進行統一配置。 例如: ``` fooRealm = com.company.foo.Realm barRealm = com.company.another.Realm bazRealm = com.company.baz.Realm securityManager.realms = $fooRealm, $barRealm, $bazRealm ``` 明確設置是確定性的,你可以非常確切地知道哪個 realm 在使用并且知道它們執行的順序。可以查看[認證](../II.%20Core%20%E6%A0%B8%E5%BF%83/5.%20Authentication%20%E8%AE%A4%E8%AF%81.md)章節的 Authentication Sequence 了解 Realm 的執行順序的影響效果 ### Implicit Assignment隱含方式(隱式) *Not Preferred(不推薦)* *這種方法可能引發意想不到的行為,如果你改變 realm 定義的順序的話。建議你避免使用此方法,并使用顯式分配,它擁有確定的行為。該功能很可能在未來的 Shiro 版本中被廢棄或移除。* 如果出于某些原因你不想顯式地配置 securityManager.realms 的屬性,你可以允許 Shiro 檢測所有配置好的 realm 并直接將它們指派給securityManager。 使用這種方法,realm 將會按照它們預先定義好的順序來指派給 securityManager 實例。 也就是說,對于下面的 shiro.ini 示例: ``` blahRealm = com.company.blah.Realm fooRealm = com.company.foo.Realm barRealm = com.company.another.Realm # no securityManager.realms assignment here ``` 基本上和下面這一行具有相同的效果: ``` securityManager.realms = $blahRealm, $fooRealm, $barRealm ``` 然而,實現隱式分配,只是 realm 定義的順序直接影響到了它們在身份驗證和授權嘗試中的訪問順序。如果你改變它們定義的順序,你將改變主要的[認證](../II.%20Core%20%E6%A0%B8%E5%BF%83/5.%20Authentication%20%E8%AE%A4%E8%AF%81.md)章節的 Authentication Sequence 的Authentication Sequence 是如何起作用的。由于這個原因,以及保證明確的行為,我們推薦使用顯式分配而不是隱式分配。 ## Realm Authentication 當你理解了Shiro 的主要 [認證](https://github.com/waylau/apache-shiro-1.2.x-reference/blob/master/II.%20Core%20%E6%A0%B8%E5%BF%83/5.%20Authentication%20%E8%AE%A4%E8%AF%81.md) 工作流后,了解在一個授權嘗試中當 Authenticator 與 Realm 交互時到底發生了什么是很重要的。 ### Supporting AuthenticationTokens 正如在認證流程中提到的,在一個 Realm 執行一個驗證嘗試之前,它的[supports](http://shiro.apache.org/static/current/apidocs/org/apache/shiro/realm/Realm.html#supports(org.apache.shiro.authc.AuthenticationToken))方法被調用。只有在返回值為 true 的時候它的getAuthenticationInfo(token) 方法才會執行。 通常情況下,一個 realm 將檢查提交的令牌類型(接口或類)確定自己是否可以處理它,例如,一個處理生物特性數據的Realm 可能一點也不理解 UsernamePasswordTokens,在這種情況下它將從支持函數中返回 false。 ### Handling supported AuthenticationTokens 如果一個Realm支持提交的驗證令牌,驗證將調用 Realm 的[getAuthenticationInfo(token)](http://shiro.apache.org/static/current/apidocs/org/apache/shiro/realm/Realm.html#getAuthenticationInfo(org.apache.shiro.authc.AuthenticationToken)) 方法,這是Realm 使用后臺數據進行驗證的一次有效嘗試,順序執行以下動作: 1\.檢查主要 principal (身份)令牌(用戶身份信息); 2\.基于主要 principal (信息),在數據源中查找對應的用戶數據; 3\.確定令牌支持的 credentials (憑證數據)和存儲的數據相符; 4\.如果憑證相符,返回一個[AuthenticationInfo](http://shiro.apache.org/static/current/apidocs/org/apache/shiro/authc/AuthenticationInfo.html)實例,里面封裝了 Shiro 可以理解的用戶數據。 5\.如果證據不符,拋出 [AuthenticationException](http://shiro.apache.org/static/current/apidocs/org/apache/shiro/authc/AuthenticationException.html)異常。 這是所有Realm getAuthenticationInfo 實現的最高級別工作流,Realm 在這個過程中可以自由做自己想做的事情,比如記錄日志,修改數據,以及其他,只要對于存儲的數據和驗證嘗試來講是合理的就行。 僅有一件事情是必須的,如果 credentials (憑證)和給定的 principal (主要信息)匹配,需要返回一個非空的 AuthenticationInfo 實例,用來表示來自數據源的 Subject 賬戶信息。 *節約時間* *直接實現 [Realm](http://shiro.apache.org/static/current/apidocs/org/apache/shiro/realm/Realm.html) 接口也許需要時間并容易出錯,大部分用戶選擇繼承 [AuthorizingRealm](http://shiro.apache.org/static/current/apidocs/org/apache/shiro/realm/AuthorizingRealm.html) 虛擬類,這個類實現了常用的認證和授權工作流,這會節省你的時間而且不易出錯。* ### Credentials Matching 憑證匹配 在上述 realm 認證工作流中,一個 Realm 必須較驗 Subject 提交的憑證(如密碼)是否與存儲在數據中的憑證相匹配,如果匹配,驗證成功,系統保留已認證的終端用戶身份。 *Realm憑證匹配* *檢查提交的憑證是否與后臺存儲數據相匹配是每一個 Realm 的責任而不是 Authenticator 的責任,每一個 Realm 都具備與憑證形式及存儲密切相關的技能,可以執行詳細的憑證比對,而 Authenticator 只是一個普通的工作流組件。* 憑證匹配的過程在所有程序中基本上是一樣的,通常只是對比數據方式不同。要確保這個過程在必要時是可插拔和可定制的,[AuthenticatingRealm](http://shiro.apache.org/static/current/apidocs/org/apache/shiro/realm/AuthenticatingRealm.html) 以及它的子類支持用 [CredentialsMatcher](http://shiro.apache.org/static/current/apidocs/org/apache/shiro/authc/credential/CredentialsMatcher.html) 來執行一個憑證對比。 在找到用戶數據之后,它和提交的 AuthenticationToken 一起傳遞給一個 CredentialsMatcher ,后者用來檢查提交的數據和存儲的數據是否相匹配。 Shiro某些 CredentialsMatcher 實現可以使你開箱即用,比如 [SimpleCredentialsMatcher](http://shiro.apache.org/static/current/apidocs/org/apache/shiro/authc/credential/SimpleCredentialsMatcher.html) 和 [HashedCredentialsMatcher](http://shiro.apache.org/static/current/apidocs/org/apache/shiro/authc/credential/HashedCredentialsMatcher.html) 實現,但如果你想配置一個自定義的實現來完成特定的對比邏輯,你可以這樣做: ``` Realm myRealm = new com.company.shiro.realm.MyRealm(); CredentialsMatcher customMatcher = new com.company.shiro.realm.CustomCredentialsMatcher(); myRealm.setCredentialsMatcher(customMatcher); ``` 或者,使用 Shiro 的 INI[配置](../I.%20Overview%20%E6%80%BB%E8%A7%88/4.%20Configuration%20%E9%85%8D%E7%BD%AE.md)文件 ``` [main] ... customMatcher = com.company.shiro.realm.CustomCredentialsMatcher myRealm = com.company.shiro.realm.MyRealm myRealm.credentialsMatcher = $customMatcher ... ``` #### Simple Equality Check 簡單證明匹配 所有 Shiro 的開箱即用 Realm 默認使用一個 [SimpleCredentialsMatcher](http://shiro.apache.org/static/current/apidocs/org/apache/shiro/authc/credential/SimpleCredentialsMatcher.html), SimpleCredentialsMatcher 對存儲的用戶憑證和從 AuthenticationToken 提交的用戶憑證直接執行相等檢查。 例如,如果提交了一個[UsernamePasswordToken](http://shiro.apache.org/static/current/apidocs/org/apache/shiro/authc/UsernamePasswordToken.html),SimpleCredentialsMatcher 檢查提交的密碼與存儲的密碼是否完全相等。 SimpleCredentialsMatcher 不僅僅對字符串執行相同對比,它可以對大多數常用類型,如字符串、字符數組、字節數組、文件和輸入流等執行對比,查看 JavaDoc 獲取更多的信息。 #### Hashing Credentials 哈希憑證: 取代將憑證按它們原始形式存儲并執行原始數據的對比,存儲終端用戶的憑證(如密碼)更安全的辦法是在存儲數據之前,先進行 hash 運算。 這確保終端用戶的憑證不會以他們原始的形式存儲,沒有人能知道其原始值。與明文原始比較相比這是一種更為安全的做法,有安全意識的程序會更喜歡這種方法。 要支持這種加密的 hash 策略,Shiro 為 Realm 配置提供了一個[HashedCredentialsMatcher](http://shiro.apache.org/static/current/apidocs/org/apache/shiro/authc/credential/HashedCredentialsMatcher.html) 實現替代之前的 SimpleCredentialsMatcher。 Hashing 憑證以及 hash 迭代的好處超出了該 Realm 文檔的范圍,可以在[HashedCredentialsMatcher JavaDoc](http://shiro.apache.org/static/current/apidocs/org/apache/shiro/authc/credential/HashedCredentialsMatcher.html)更詳細地了解這些主要內容。 ##### Hashing and Corresponding Matchers 哈希以及相符合的匹配 對于一個使用 Shiro 的程序,如何配置才能簡單地做到這些? Shiro 提供了多個 HashedCredentialsMatcher 子類實現,你必須在你的 Realm 上配置指定的實現來匹配你的憑證所使用的 hash 算法。 例發,假設你的程序使用用戶名/密碼對來進行驗證,基于上述 hash 憑證的好處,你希望當創建用戶時以 [SHA-265](http://en.wikipedia.org/wiki/SHA_hash_functions) 方式加密用戶的密碼,你可以加密用戶輸入的明文密碼并保存加密值: ``` import org.apache.shiro.crypto.hash.Sha256Hash; import org.apache.shiro.crypto.RandomNumberGenerator; import org.apache.shiro.crypto.SecureRandomNumberGenerator; ... //我們將使用一個隨機數發生器產生的鹽。 //這比使用一個用戶名作為鹽或不使用鹽更加安全。 //Shiro使這個實現變得容易。 // //注意一個正常的應用程序將引用屬性而 //不是每次創建一個新的RNG: RandomNumberGenerator rng = new SecureRandomNumberGenerator(); Object salt = rng.nextBytes(); //我們的純文本密碼經過散列隨機鹽和多次迭代, //得到Base64編碼的值(比Hex需要較少的空間): String hashedPasswordBase64 = new Sha256Hash(plainTextPassword, salt, 1024).toBase64(); User user = new User(username, hashedPasswordBase64); //在新帳戶保存鹽。該 HashedCredentialsMatcher //稍后再的登錄嘗試的時候會處理它: user.setPasswordSalt(salt); userDAO.create(user); ``` 由于你使用 SHA-256 加密你的密碼,你需要告訴 Shiro 使用相應的 HashedCredentialsMatcher 來檢查你的 hashing 值,在這個例子中,我們為了加強安全創建了一個隨機的 salt 并且執行 1024 Hash 迭代(查看HashedCredentialsMatcher JAVADoc了解為什么),下面的Shiro INI 配置來做這件工作。 ``` [main] ... credentialsMatcher = org.apache.shiro.authc.credential.Sha256CredentialsMatcher # base64 編碼, 例子中沒有 hex: credentialsMatcher.storedCredentialsHexEncoded = false credentialsMatcher.hashIterations = 1024 # 下面屬性只在 Shiro 1.0 需要,在 1.1 及以后版本移除了: credentialsMatcher.hashSalted = true ... myRealm = com.company..... myRealm.credentialsMatcher = $credentialsMatcher ... ``` ##### HSaltedAuthenticationInfo 確保正常運行的最后一件要做的事情是你的Realm實現必須返回一個 [SaltedAuthenticationInfo](http://shiro.apache.org/static/current/apidocs/org/apache/shiro/authc/SaltedAuthenticationInfo.html) 實例而不是普通的AuthenticationInfo,SaltedAuthenticationInfo 接口確保你在創建用戶帳戶時使用的salt(如上面調用的 user.setPasswordSalt(salt);)能被 HashedCredentialsMatcher 引用。 HashedCredentialsMatcher 需要使用 salt 來對提交的 AuthenticationToken 執行相同的 hashing 技術來對比提交的令牌是否與存儲的數據相匹配,所以如果你對用戶密碼使用 salting(你應該這么做),確保你的 Realm 實現在返回 SaltedAuthenticationInfo 實例時引用它。 ### Disabling Authentication 禁用 如果有理由,你不希望某個 Realm 對某個資源執行驗證(或者因為你只想 Realm 去執行授權檢查),你可以完全禁用 Realm 的認證支持,方法就是在 Realm 的 supports 方法中始終返回 false,這樣,你的 Realm 將在整個驗證過程中不再被使用。 當然如果你想驗證 Subject,至少要配置一個支持 AuthenticationTokens 的 Realm。 ## Realm Authorization 待定。 ## 為文檔加把手 我們希望這篇文檔可以幫助你使用 Apache Shiro 進行工作,社區一直在不斷地完善和擴展文檔,如果你希望幫助 Shiro 項目,請在你認為需要的地方考慮更正、擴展或添加文檔,你提供的任何點滴幫助都將擴充社區并且提升 Shiro。 提供你的文檔的最簡單的途徑是將它發送到用戶[論壇](http://shiro-user.582556.n2.nabble.com/)或[郵件列表](http://shiro.apache.org/mailing-lists.html) *譯者注:*如果對本中文翻譯有疑議的或發現勘誤歡迎指正,[點此](https://github.com/waylau/apache-shiro-1.2.x-reference/issues)提問。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看