springboot + shiro學習(shiro登錄過程)


 

 

 

 

 

 

上一次配置好了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);
  }

 

 驗證成功跳轉到成功頁面,失敗拋出異常,由我們進行捕獲然后進行操作

 
        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM