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