上一次配置好了shiro,現在來看下源碼他是怎么過濾的
這是shiro內置的Filter,在上次的匹配/**中使用了authc,當我們所有請求都會先進性過濾
看FormAuthenticationFilter的源碼,找到他的繼承PathMatchingFilter,可以找到
找到他在FormAuthenticationFilter的實現
也就是當所有的請求過來我們都會進行判斷是否登錄如果沒有登錄
保存當前請求,並且跳轉到登錄,登錄鏈接是在FormAuthenticationFilter繼承類AccessControlFilter中,默認,我們在ShiroFilterFactoryBean中setLoginUrl了
然后會在AccessControlFilter中setLoginUrl
如果他是登錄請求通過url來進行匹配,然后判斷是否登錄已經在session中,如果沒有進行登錄就執行登錄
這里就用到官網說的subject.login(token);
他的token是在FormAuthenticationFilter中進行request.getParamter("")來獲取用戶名密碼,
得到token進行登錄,登錄成功跳轉到成功頁面,
他是怎么來執行login的?找了下源碼
主要是securityManager.login(this, token);
一步一步找下去
這里先從緩存里面找,找不到就用到我們自定義的realm的身份認證了,獲取了認證信息如果info不為空執行assertCredentialsMatch進行校驗
getCredentialsMatcher就是我們在配置MyRealm的bean的時候設置的驗證規則,
最后比較的都是一個SimpleHash,看下第一個tokenHashedCredentials,
首先他會獲取我們在realm身份驗證中的getCredentialsSalt
返回一個SimpleHash
hashAlgorithmName是我們當時配置的加密規則,credentials是需要加密的字段這里從token中獲取的(也就是request.getParamter("password"))
hashIterations加密次數,也是在最初配置myRealm的時候定義的
第二個accountCredentials是獲取加密后的密碼,
簡單來說就是tokenHashedCredentials和accountCredentials進行對比
tokenHashedCredentials是獲取request中的password值和token中的salt來進行加密
accountCredentials是我們保存在數據庫中的密碼,兩個結果進行對比,
所以添加用戶在入庫前的password我們要進行加密操作要和tokenHashedCredentials規則是一樣的才可以,
public static Object encodePwd(){ String hashAlgorithmName = "MD5"; String credentials = "123456"; int hashIterations = 2; // ByteSource credentialsSalt = ByteSource.Util.bytes("admin8d78869f470951332959580424d4bf4f"); return new SimpleHash(hashAlgorithmName, credentials, null, hashIterations); }
驗證成功跳轉到成功頁面,失敗拋出異常,由我們進行捕獲然后進行操作