spring security登錄成功后通過Principal獲取名返回空問題
spring security登錄成功通過Principal獲取名返回空
如上圖:
前端登錄后獲取用戶信息,principal 返回空值,經(jīng)歷種種排查發(fā)現(xiàn),前端請(qǐng)求后端,請(qǐng)求頭沒有加 bearer
按上圖配置問題解決
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ǔ)的就是訪問應(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方法,該方法會(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
來說一下這幾個(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用來查詢用戶的詳細(xì)信息,該詳細(xì)信息就是UserDetails。UserDetails的默認(rèn)實(shí)現(xiàn)是User。查詢出來UserDetails后再對(duì)用戶輸入的密碼進(jìn)行校驗(yàn)。校驗(yàn)成功則將UserDetails中的信息填充進(jìn)Authentication中返回。校驗(yàn)失敗則提醒用戶密碼錯(cuò)誤。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用SpringEvent解決WebUploader大文件上傳解耦問題
Spring Event是Spring框架內(nèi)建的一種發(fā)布/訂閱模式的實(shí)現(xiàn),它允許應(yīng)用內(nèi)部不同組件之間通過事件進(jìn)行通信,本文以WebUploader大文件上傳組件為例,在大文件處理的場(chǎng)景中使用SpringEvent的事件發(fā)布機(jī)制,靈活的擴(kuò)展對(duì)文件的處理需求,需要的朋友可以參考下2024-07-07Springboot處理配置CORS跨域請(qǐng)求時(shí)碰到的坑
本篇文章介紹了我在開發(fā)過程中遇到的一個(gè)問題,以及解決該問題的過程及思路,通讀本篇對(duì)大家的學(xué)習(xí)或工作具有一定的價(jià)值,需要的朋友可以參考下2021-09-09SpringBoot中@RequestBody不能和Multipart同時(shí)傳遞的問題解決
本文主要介紹了SpringBoot中@RequestBody不能和Multipart同時(shí)傳遞的問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04java web監(jiān)聽器統(tǒng)計(jì)在線用戶及人數(shù)
本文主要介紹了java web監(jiān)聽器統(tǒng)計(jì)在線用戶及人數(shù)的方法解析。具有很好的參考價(jià)值。下面跟著小編一起來看下吧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)是一個(gè)復(fù)雜但重要的過程,它涉及到多個(gè)方面,包括代碼分析、JVM監(jiān)控、線程管理、垃圾收集優(yōu)化、內(nèi)存管理、數(shù)據(jù)庫交互等,下面我將提供一個(gè)詳細(xì)的概述和示例代碼,需要的朋友可以參考下2025-02-02Java實(shí)現(xiàn)多線程斷點(diǎn)下載
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)多線程斷點(diǎn)下載的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03關(guān)于eclipse中運(yùn)行tomcat提示端口被占用的4種解決
這篇文章主要介紹了關(guān)于eclipse中運(yùn)行tomcat提示端口被占用的4種解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01