shiro認證

Shiro實現認證(即登錄)的步驟。

1. 獲取當前的 Subject. 調用 SecurityUtils.getSubject();
2. 測試當前的用戶是否已經被認證. 即是否已經登錄. 調用 Subject 的 isAuthenticated() 
3. 若沒有被認證, 則把用戶名和密碼封裝爲 UsernamePasswordToken 對象
    1). 創建一個表單頁面
    2). 把請求提交到 SpringMVC 的 Handler
    3). 獲取用戶名和密碼. 
4. 執行登錄: 調用 Subject 的 login(AuthenticationToken) 方法. 
5. 自定義 Realm 的方法, 從數據庫中獲取對應的記錄, 返回給 Shiro.
    1). 實際上需要繼承 org.apache.shiro.realm.AuthenticatingRealm 類
    2). 實現 doGetAuthenticationInfo(AuthenticationToken) 方法. 

6. 由 shiro 完成對密碼的比對. 


1. 授權需要繼承 AuthorizingRealm 類, 並實現其 doGetAuthorizationInfo 方法

2. AuthorizingRealm 類繼承自 AuthenticatingRealm, 但沒有實現 AuthenticatingRealm 中的 
doGetAuthenticationInfo, 所以認證和授權只需要繼承 AuthorizingRealm 就可以了. 同時實現他的兩個抽象方法.

1. 爲什麼使用 MD5 鹽值加密: 
2. 如何做到:
    1). 在 doGetAuthenticationInfo 方法返回值創建 SimpleAuthenticationInfo 對象的時候, 需要使用
    SimpleAuthenticationInfo(principal, credentials, credentialsSalt, realmName) 構造器
    2). 使用 ByteSource.Util.bytes() 來計算鹽值. 
    3). 鹽值需要唯一: 一般使用隨機字符串或 user id
    4). 使用 new SimpleHash(hashAlgorithmName, credentials, salt, hashIterations); 來計算鹽值加密後的密碼的值. 

    5). 在Spring配置文件中配置Realm鹽值加密(可配置多個)

<bean id="jdbcRealm" class="cn.com.shiro.realm.ShiroRealm">
     <property name="credentialsMatcher">
          <bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
              <!-- 指定加密算法爲MD5 -->
              <property name="hashAlgorithmName" value="MD5"></property>
              <!-- 指定加密次數爲1024次 -->
              <property name="hashIterations" value="1024"></property>
          </bean>
      </property>
 </bean>

* 如何把一個字符串加密爲 MD5 
* 替換當前 Realm 的 credentialsMatcher 屬性. 直接使用 HashedCredentialsMatcher 對象, 並設置加密算法即可. 
* 密碼的比對:
通過 AuthenticatingRealm 的 credentialsMatcher 屬性來進行的密碼的比對!


發佈了75 篇原創文章 · 獲贊 8 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章