上一次配置好了shiro,如今來看下源碼他是怎麼過濾的數據庫
這是shiro內置的Filter,在上次的匹配/**中使用了authc,當咱們全部請求都會先進性過濾緩存
看FormAuthenticationFilter的源碼,找到他的繼承PathMatchingFilter,能夠找到session
找到他在FormAuthenticationFilter的實現this
也就是當全部的請求過來咱們都會進行判斷是否登陸若是沒有登陸加密
保存當前請求,而且跳轉到登陸,登陸連接是在FormAuthenticationFilter繼承類AccessControlFilter中,默認,咱們在ShiroFilterFactoryBean中setLoginUrl了url
而後會在AccessControlFilter中setLoginUrlspa
若是他是登陸請求經過url來進行匹配,而後判斷是否登陸已經在session中,若是沒有進行登陸就執行登陸3d
這裏就用到官網說的subject.login(token);他的token是在FormAuthenticationFilter中進行request.getParamter("")來獲取用戶名密碼,code
獲得token進行登陸,登陸成功跳轉到成功頁面,orm
他是怎麼來執行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); }
驗證成功跳轉到成功頁面,失敗拋出異常,由咱們進行捕獲而後進行操做