在前面一節《Shiro在Web環境下集成Spring的大致工作流程》的最后一步中提到由Shiro完整密碼比對。
那么具體是怎么工作的?
1,既然shiro會把密碼來進行比對,當然會調用
UserNamePasswordkToken 中的 getPassword() 方法了。在該方法中打上斷點,往前跟蹤一下即可。


2,開啟debug模式,跟蹤發現
org.apache.shiro.authc.credential.SimpleCredentialsMatcher 類進行密碼的比對


3,繼續跟蹤,發現我們自定義Realm的父類方法調用了
CrendebtialsMatcher組件 進行密碼比對


CrendentialsMatcher組件(憑證匹配器)作用
1,用來進行密碼比對。
2,用來對密碼進行加密。
3,shiro提供了該組件接口的很多實現類,用於不同類型的密碼加密。
常用的加密實現類為:
HashedCrendentialsMatcher。
4,替換當前 Realm 的 crendentialsMatcher 屬性,直接使用 HasedCrendentialsMatcher 對象,並設置加密算法即可。
結論:
①通過
AuthenticatingRealm 的 CrendentialsMatcher 屬性來進行的密碼的比對。
②指定具體的 CrendentialsMatcher 接口的實現類來
設置加密算法,鹽值和循環加密次數。
③如果兩個用戶擁有相同的原始密碼,那么加密后的數據也是一樣的,這還是有點安全隱患的,所以
鹽值最好設置為一個用戶的唯一值(一般采用用戶名)。
④在自定義Realm的認證方法(doAuthenticationInfo方法),返回的SimpeAuthenticationInfo對象時,需要采用帶有ByteSource參數的構造函數來構建對象。
ByteSource對象可以采用
ByteSource.Util.byte(String UserID)獲取;
⑤使用 new SimpleHash(hashAlgorithmName,salt,hashIterations); 來計算加鹽后的密碼值。