spring security登錄成功后通過(guò)Principal獲取名返回空問(wèn)題
spring security登錄成功通過(guò)Principal獲取名返回空

如上圖:
前端登錄后獲取用戶信息,principal 返回空值,經(jīng)歷種種排查發(fā)現(xiàn),前端請(qǐng)求后端,請(qǐng)求頭沒(méi)有加 bearer

按上圖配置問(wèn)題解決
spring security principal credentials authorities details authenticated
spring security在進(jìn)行認(rèn)證時(shí),會(huì)將用戶名和密碼封裝成一個(gè)Authentication對(duì)象,在進(jìn)行認(rèn)證后,會(huì)將Authentication的權(quán)限等信息填充完全返回。
Authentication會(huì)被存在SecurityContext中,供應(yīng)用之后的授權(quán)等操作使用。
此處介紹下Authentication,Authentication存儲(chǔ)的就是訪問(wèn)應(yīng)用的用戶的一些信息。
下面是Authentication源碼
public interface Authentication extends Principal, Serializable {
//用戶的權(quán)限集合
Collection<? extends GrantedAuthority> getAuthorities();
//用戶登錄的憑證,一般指的就是密碼
Object getCredentials();
//用戶的一些額外的詳細(xì)信息,一般不用
Object getDetails();
//這里認(rèn)為Principal就為登錄的用戶
Object getPrincipal();
//是否已經(jīng)被認(rèn)證了
boolean isAuthenticated();
//設(shè)置認(rèn)證的狀態(tài)
void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException;
}講解了Authentication后,我們回過(guò)頭來(lái)再看attemptAuthentication方法,該方法會(huì)調(diào)用AuthenticationManager的authenticate方法進(jìn)行認(rèn)證并返回一個(gè)填充完整的Authentication對(duì)象。
在這里我們又要講解一下認(rèn)證的幾個(gè)核心的類,很重要!
- a). AuthenticationManager
- b).ProviderManager
- c).AuthenticationProvider
- d).UserDetailsService
- e).UserDetails
來(lái)說(shuō)一下這幾個(gè)類的作用以及關(guān)聯(lián)關(guān)系
- a). AuthenticationManager是一個(gè)接口,提供了authenticate方法用于認(rèn)證。
- b). AuthenticationManager有一個(gè)默認(rèn)的實(shí)現(xiàn)ProviderManager,其實(shí)現(xiàn)了authenticate方法。
- c). ProviderManager內(nèi)部維護(hù)了一個(gè)存有AuthenticationProvider的集合,ProviderManager實(shí)現(xiàn)的authenticate方法再調(diào)用這些AuthenticationProvider的authenticate方法去認(rèn)證,表單提交默認(rèn)用的AuthenticationProvider實(shí)現(xiàn)是DaoAuthenticationProvider。
- d). AuthenticationProvider中維護(hù)了UserDetailsService,我們使用內(nèi)存中的用戶,默認(rèn)的實(shí)現(xiàn)是InMemoryUserDetailsManager。UserDetailsService用來(lái)查詢用戶的詳細(xì)信息,該詳細(xì)信息就是UserDetails。UserDetails的默認(rèn)實(shí)現(xiàn)是User。查詢出來(lái)UserDetails后再對(duì)用戶輸入的密碼進(jìn)行校驗(yàn)。校驗(yàn)成功則將UserDetails中的信息填充進(jìn)Authentication中返回。校驗(yàn)失敗則提醒用戶密碼錯(cuò)誤。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- springsecurity實(shí)現(xiàn)用戶登錄認(rèn)證快速使用示例代碼(前后端分離項(xiàng)目)
- Spring Security6 最新版配置及實(shí)現(xiàn)動(dòng)態(tài)權(quán)限管理
- SpringSecurity request過(guò)濾問(wèn)題示例小結(jié)
- SpringBoot中使用SpringSecurity進(jìn)行權(quán)限控制的示例代碼
- springsecurity記住我登錄時(shí)訪問(wèn)無(wú)權(quán)限接口跳轉(zhuǎn)登錄界面的處理方案
- spring security獲取用戶信息為null或者串值的解決
相關(guān)文章
SpringBoot數(shù)據(jù)庫(kù)索引優(yōu)化指南
本文詳細(xì)介紹了MySQL慢查詢?nèi)罩镜呐渲门c分析方法,包括動(dòng)態(tài)配置和修改配置文件兩種方式,以及SpringBoot項(xiàng)目中打印SQL執(zhí)行日志的配置,需要的朋友可以參考下2026-04-04
Spring MVC整合Shiro權(quán)限控制的方法
這篇文章主要介紹了Spring MVC整合Shiro權(quán)限控制,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
淺談Java繼承中的轉(zhuǎn)型及其內(nèi)存分配
這篇文章主要介紹了淺談Java繼承中的轉(zhuǎn)型及其內(nèi)存分配,首先分享了簡(jiǎn)單的代碼及運(yùn)行結(jié)果,然后對(duì)其進(jìn)行分析,繼而引出了2017-11-11
Java并發(fā)編程之ReentrantLock實(shí)現(xiàn)原理及源碼剖析
ReentrantLock 是常用的鎖,相對(duì)于Synchronized ,lock鎖更人性化,閱讀性更強(qiáng),文中將會(huì)詳細(xì)的說(shuō)明,請(qǐng)君往下閱讀2021-09-09

