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行打斷點,再直接操作數據庫就可以修改密碼

