關於 spring security 對用戶名和密碼的校驗過程


1.執行 AuthenticationManager 認證方法 authenticate(UsernamePasswordAuthenticationToken)

2.ProviderManager 實現了 authenticate(UsernamePasswordAuthenticationToken)

3.ProviderManager 是通過自身管理的n個AuthenticationProvider認證提供者去進行認證

4.AuthenticationProvider認證提供者 使用自身的authenticate(Authentication)方法;

5.AuthenticationProvider的authenticate(Authentication)方法是被AbstractUserDetailsAuthenticationProvider所實現

6.AbstractUserDetailsAuthenticationProvider 抽象用戶細節認證提供者 會調用 自身聲明的retrieveUser抽象方法來檢索用戶

7.retrieveUser抽象方法在DaoAuthenticationProvider 持久層認證提供者 中進行了體現

8.DaoAuthenticationProvider 持久層認證提供者 包含 UserDetailsService 用戶細節處理器,

9.用戶細節處理器的loadUserByUsername方法又被自定義的UserDetailsServiceImpl所實現

10.UserDetailsServiceImpl實現類取出數據庫中的該登錄名的數據(selectUserByUserName),並將用戶的菜單權限數據和基本信息封裝成一個UserDetails用戶細節返回!

11.AbstractUserDetailsAuthenticationProvider 抽象用戶細節認證提供者 最終獲取到UserDeatils

12.然后AbstractUserDetailsAuthenticationProvider 調用additionalAuthenticationChecks方法對用戶的密碼進行最后的檢查

13.密碼的校驗是由BCryptPasswordEncoder 通過實現PasswordEncoder 的matches方法來完成,

14.BCryptPasswordEncoder .matches 方法會校驗密文是否屬於自己的編碼格式,最終密碼校驗的細節完全在BCrypt實體類中進行

 

###BCrypt 如何判斷 密碼和數據庫的密碼是否相同的?

首先BCrypt 是從數據庫的密碼中提取加密的鹽值,並校驗數據庫密碼的長度不能小於28和數據庫密碼的版本(前兩個字符必須是"$2")

然后從數據庫密碼中獲取真正的鹽值,然后將用戶提交的密碼結合鹽值加密,對比加密后的密碼與數據庫是否一致

當然特殊情況下你可以在BCrypt 源碼的第345行打斷點,再直接操作數據庫就可以修改密碼

 


免責聲明!

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



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