若依管理系统——前后端分离版(二)登陆接口分析及SpringSecurity的登陆认证流程
一、登陸流程分析
0. 流程整理
1. 圖片驗證碼接口/captchaImage
2.登陸驗證接口/login
2.1 校驗圖片驗證碼
2.1 查詢用戶信息
2.3查詢用戶的權限信息
2.4 生成令牌token
3.登錄
二、SpringSecurity的登陸認證流程分析
1. AuthenticationManager 認證管理器
2. ProviderManager
3. AbstractUserDetailsAuthenticationProvider 查詢UserDetails信息
4. DaoAuthenticationProvider
5. UserDetailsService
6. AbstractUserDetailsAuthenticationProvider 進行認證
6.1 認證前校驗
6.2 附加校驗
6.3 認證后校驗
三、在請求頭中攜帶token信息請求后臺接口
1. 獲得請求頭
2.獲取請求頭中的認證信息
3.解析jwt令牌,獲取緩存中的用戶信息
一、登陸流程分析
0. 流程整理
1. 圖片驗證碼接口/captchaImage
在登陸之前會有一個請求圖片驗證碼的接口/captchaImage,頁面獲得圖片驗證碼,后臺接口生成一個圖片和UUID,并將驗證碼Code和UUID存入的到Redis緩存中。
2.登陸驗證接口/login
2.1 校驗圖片驗證碼
參數包括:登錄名、密碼、驗證碼、唯一標識,進行登錄驗證。
2.1 查詢用戶信息
如果驗證碼驗證成功,則開始檢驗用戶信息:會去調用 UserDetailsServiceImpl的loadUserByUsername方法。進行用戶認證流程,具體見下一節。
UserDetailsServiceImpl是我們實現了UserDetailsService接口:
返回一個UserDetails對象,包括用戶對象和用戶的權限信息。
LoginUser實現了UserDetails
2.3查詢用戶的權限信息
sys_menu是菜單權限表,關聯了角色-菜單關聯表、用戶-角色關聯表、角色表。
也就是根據用戶Id通過用戶表-角色關聯表 查詢 角色信息,在通過角色-菜單表 查詢菜單信息。
2.4 生成令牌token
先通過工具類生成一個UUID,作為令牌的唯一標識。
refreshToken()方法以生成的UUID加前綴作為Key,將用戶信息存到緩存中,并設置有效期。
使用createToken方法生成 JWT 令牌
流程總結:
查詢用戶信息,生成UUID,以UUID作為key,用戶信息為Value 存入緩存,在將UUID信息存放到到JWT令牌中,將令牌返回給前端頁面。
用戶再次請求的時候將令牌放到請求頭中,后臺解析令牌,獲得UUID,去緩存中回去用戶信息。
3.登錄
登錄成功:
二、SpringSecurity的登陸認證流程分析
1. AuthenticationManager 認證管理器
根據用戶輸入的用戶名、密碼構建了 UsernamePasswordAuthenticationToken,并將其交給 AuthenticationManager 來進行認證處理。AuthenticationManager 本身不包含認證邏輯,其核心是用來管理所有的 AuthenticationProvider,通過交由合適的 AuthenticationProvider 來實現認證。
2. ProviderManager
下面跳轉到了 ProviderManager ,該類是 AuthenticationManager 的實現類。
3. AbstractUserDetailsAuthenticationProvider 查詢UserDetails信息
傳統表單登錄的 AuthenticationProvider 主要是由 AbstractUserDetailsAuthenticationProvider 來進行處理的,通過 retrieveUser() 方法讀取到數據庫中的用戶信息,具體實現在 DaoAuthenticationProvider 中
4. DaoAuthenticationProvider
5. UserDetailsService
這里調用了UserDetailsService的loadUserByUsername方法,而我們的UserDetailsServiceImpl實現了UserDetailsService接口,重寫了loadUserByUsername方法
6. AbstractUserDetailsAuthenticationProvider 進行認證
當我們成功的讀取 UserDetails 后,下面開始對其進行認證。
6.1 認證前校驗
6.2 附加校驗
6.3 認證后校驗
我們可以看到認證校驗分為 前校驗、附加校驗和后校驗,如果任何一個校驗出錯,就會拋出相應的異常。所有校驗都通過后,調用 createSuccessAuthentication() 返回認證信息。
在 createSuccessAuthentication 方法中,我們發現它重新 new 了一個 UsernamePasswordAuthenticationToken,因為到這里認證已經通過了,所以將 authorities 注入進去,并設置 authenticated 為 true。
到此就已經認證完成了。
SpringSecurity認證流程文章參考:https://jitwxs.blog.csdn.net/article/details/84703690
三、在請求頭中攜帶token信息請求后臺接口
比如 登錄后請求的/getInfo接口:
請求后臺接口時,獲取請求頭中的認證信息:
Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6ImE5ZWQ4MjYxLTRmOTgtNDY1Zi1iNTcwLTlkMmU2MGEyOWQzOCJ9.z0gvgUQPDQSiMAm5QfljsRSPGkJhuCvjlA--m_Jd7y87QICeb53Sj28yMLxNQwkoXqwsk3HKLnkX1OjA5goUdQ
1
1. 獲得請求頭
首先使用ServletUtils.getRequest()獲取request信息,這個方法有調用的是getRequestAttributes()方法,
2.獲取請求頭中的認證信息
獲得了request信息后,從請求頭中獲取token:
3.解析jwt令牌,獲取緩存中的用戶信息
解析token,獲取唯一標識,根據唯一標識獲得緩存中的用戶信息:
由此就獲得了用戶的信息,在根據用戶信息查詢對應的角色和權限。
?
總結
以上是生活随笔為你收集整理的若依管理系统——前后端分离版(二)登陆接口分析及SpringSecurity的登陆认证流程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RuoYi(若依开源框架)-前后台分离版
- 下一篇: 七年前将UC卖给马云,套现300亿的何小