三,shiro的憑證匹配器(密碼匹配器)原始碼分析
這個是CredentialsMatcher介面的所有實作,實作類中都要實作doCredentialsMatch(token,info)方法,紅色標記的都是散列演算法,有MD5,SHA-512,SHA-256等等,

1.AllowAllCredentialsMatcher,這個類比較奇葩,你傳什么都會驗證通過,后續shiro可能會繼續擴展,

2.PasswordMatcher,這個類要配合PasswordService這個介面使用,實際上就是自己在PasswordService的實作類中添加匹配邏輯,加密演算法可以自己開發,

3.SimpleCredentialsMatcher,SimpleCredentialsMatcher繼承CodecSupport,CodecSupport這個類,實際是個工具類,它提供了位元組陣列,字符陣列,字串相互轉換的方法,還包括檔案File,輸入流InputStream,物件Object轉位元組陣列的方法,
3.1.繼續看SimpleCredentialsMatcher的doCredentialsMatch()方法,這里從token和info里面拿到密碼資訊后,就呼叫equals()方法,

3.2.equals()方法里面,如果密碼都是字串就直接呼叫字串的equals()方法,否則就全部轉成位元組陣列,然后比較位元組陣列是否一樣,

4.HashedCredentialsMatcher,這個類提供散列演算法,密碼可以加鹽,這個類繼承SimpleCredentialsMatcher,查看該類的doCredentialsMatch()方法,是重寫了父類的方法, 可以看到,最后還是呼叫SimpleCredentialsMatcher的equals()方法,

4.1 hashProvidedCredentials(token, info)這個方法里面的邏輯,是從token中拿到前臺傳來的密碼,然后從info中拿到鹽和加密次數,構造SimpleHash物件,

token.getCredentials()這個方法,就是從前臺引數的token中獲取密碼,

4.2 getCredentials(info)這個方法里面的邏輯,從info中獲取密碼,也就是資料庫中存的密碼,構造hash物件,這里的hash物件也是SimpleHash物件,

4.3上面兩個方面都回傳SimpleHash物件,因為SimpleHash實作了Hash介面,Hash介面又繼承了ByteSource介面,equals()中,這兩個SimpleHash會轉成位元組陣列,最后呼叫MessageDigest.isEqual(tokenBytes, accountBytes)方法,比較字符陣列是否相等,

我們繼續跟蹤shiro在認證的程序中,看什么地方呼叫密碼匹配器,
在AuthenticatingRealm類中查看getAuthenticationInfo(token)方法,此時已經拿到info資訊,info里面就有從資料庫中獲取的密碼和鹽

繼續查看assertCredentialsMatch(token,info)方法,方法里面就呼叫了密碼匹配器的doCredentialsMatch()方法,如果匹配失敗,就拋出密碼錯誤的例外,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/141399.html
標籤:Java
上一篇:Java中多執行緒的使用(超級超級詳細)+多執行緒的實作原理 2
下一篇:執行緒池
