spring security登錄成功后通過Principal獲取名返回空問題
spring security登錄成功通過Principal獲取名返回空

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

按上圖配置問題解決
spring security principal credentials authorities details authenticated
spring security在進(jìn)行認(rèn)證時,會將用戶名和密碼封裝成一個Authentication對象,在進(jìn)行認(rèn)證后,會將Authentication的權(quán)限等信息填充完全返回。
Authentication會被存在SecurityContext中,供應(yīng)用之后的授權(quán)等操作使用。
此處介紹下Authentication,Authentication存儲的就是訪問應(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后,我們回過頭來再看attemptAuthentication方法,該方法會調(diào)用AuthenticationManager的authenticate方法進(jìn)行認(rèn)證并返回一個填充完整的Authentication對象。
在這里我們又要講解一下認(rèn)證的幾個核心的類,很重要!
- a). AuthenticationManager
- b).ProviderManager
- c).AuthenticationProvider
- d).UserDetailsService
- e).UserDetails
來說一下這幾個類的作用以及關(guān)聯(lián)關(guān)系
- a). AuthenticationManager是一個接口,提供了authenticate方法用于認(rèn)證。
- b). AuthenticationManager有一個默認(rèn)的實現(xiàn)ProviderManager,其實現(xiàn)了authenticate方法。
- c). ProviderManager內(nèi)部維護(hù)了一個存有AuthenticationProvider的集合,ProviderManager實現(xiàn)的authenticate方法再調(diào)用這些AuthenticationProvider的authenticate方法去認(rèn)證,表單提交默認(rèn)用的AuthenticationProvider實現(xiàn)是DaoAuthenticationProvider。
- d). AuthenticationProvider中維護(hù)了UserDetailsService,我們使用內(nèi)存中的用戶,默認(rèn)的實現(xiàn)是InMemoryUserDetailsManager。UserDetailsService用來查詢用戶的詳細(xì)信息,該詳細(xì)信息就是UserDetails。UserDetails的默認(rèn)實現(xiàn)是User。查詢出來UserDetails后再對用戶輸入的密碼進(jìn)行校驗。校驗成功則將UserDetails中的信息填充進(jìn)Authentication中返回。校驗失敗則提醒用戶密碼錯誤。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用SpringEvent解決WebUploader大文件上傳解耦問題
Spring Event是Spring框架內(nèi)建的一種發(fā)布/訂閱模式的實現(xiàn),它允許應(yīng)用內(nèi)部不同組件之間通過事件進(jìn)行通信,本文以WebUploader大文件上傳組件為例,在大文件處理的場景中使用SpringEvent的事件發(fā)布機制,靈活的擴(kuò)展對文件的處理需求,需要的朋友可以參考下2024-07-07
SpringBoot中@RequestBody不能和Multipart同時傳遞的問題解決
本文主要介紹了SpringBoot中@RequestBody不能和Multipart同時傳遞的問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
java web監(jiān)聽器統(tǒng)計在線用戶及人數(shù)
本文主要介紹了java web監(jiān)聽器統(tǒng)計在線用戶及人數(shù)的方法解析。具有很好的參考價值。下面跟著小編一起來看下吧2017-04-04
在Java生產(chǎn)環(huán)境下進(jìn)行性能監(jiān)控與調(diào)優(yōu)的詳細(xì)過程
在Java生產(chǎn)環(huán)境下進(jìn)行性能監(jiān)控與調(diào)優(yōu)是一個復(fù)雜但重要的過程,它涉及到多個方面,包括代碼分析、JVM監(jiān)控、線程管理、垃圾收集優(yōu)化、內(nèi)存管理、數(shù)據(jù)庫交互等,下面我將提供一個詳細(xì)的概述和示例代碼,需要的朋友可以參考下2025-02-02
關(guān)于eclipse中運行tomcat提示端口被占用的4種解決
這篇文章主要介紹了關(guān)于eclipse中運行tomcat提示端口被占用的4種解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01

