spring security獲取用戶信息為null或者串值的解決
spring security獲取用戶信息為null或串值
在spring security,用SecurityContextHolder.getContext().getAuthentication().getPrincipal()獲取登錄用戶的信息
發(fā)現(xiàn)獲取到的用戶有串值現(xiàn)象——獲取用戶信息
發(fā)現(xiàn)獲取到的是別人的信息,偶發(fā)性還有取值為null的情況
問題的原因
經(jīng)同事提醒,是不是用了多線程,查到了問題的原因。
//原代碼
ExecutorService executorService = Executors.newCachedThreadPool(new ThreadFactoryBuilder().setNameFormat("job").build());
executorService.execute(() -> {
//獲取用戶對(duì)象
LoginUserDetails userDetails = (LoginUserDetails)SecurityContextHolder.getContext()
.getAuthentication().getPrincipal();
});
//改進(jìn)后
ExecutorService executorService = Executors.newCachedThreadPool(new ThreadFactoryBuilder().setNameFormat("job").build());
SecurityContext securityContext = SecurityContextHolder.getContext();
executorService.execute(() -> {
//把context設(shè)置進(jìn)去
SecurityContextHolder.setContext(securityContext);
//獲取用戶對(duì)象
LoginUserDetails userDetails = (LoginUserDetails)SecurityContextHolder.getContext()
.getAuthentication().getPrincipal();
});

源碼:

ThreadLocal是線程獨(dú)有的局部變量
只針對(duì)當(dāng)前線程,當(dāng)前代碼里使用了嵌套線程
子線程里的SecurityContext和父線程里的SecurityContext不是同一個(gè)
需要從父線程把SecurityContext傳入到子線程
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- spring security登錄成功后通過Principal獲取名返回空問題
- springsecurity實(shí)現(xiàn)用戶登錄認(rèn)證快速使用示例代碼(前后端分離項(xiàng)目)
- Spring Security6 最新版配置及實(shí)現(xiàn)動(dòng)態(tài)權(quán)限管理
- SpringSecurity request過濾問題示例小結(jié)
- SpringBoot中使用SpringSecurity進(jìn)行權(quán)限控制的示例代碼
- springsecurity記住我登錄時(shí)訪問無權(quán)限接口跳轉(zhuǎn)登錄界面的處理方案
相關(guān)文章
Java日期轉(zhuǎn)換注解配置date?format時(shí)間失效
這篇文章主要為大家介紹了Java日期轉(zhuǎn)換注解配置date?format時(shí)間失效,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
鄰接表無向圖的Java語言實(shí)現(xiàn)完整源碼
這篇文章主要介紹了鄰接表無向圖的Java語言實(shí)現(xiàn)完整源碼,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12
Java優(yōu)先隊(duì)列?priority?queue
本文主要介紹了Java優(yōu)先隊(duì)列?priority?queue,優(yōu)先隊(duì)列是一種特殊的數(shù)據(jù)結(jié)構(gòu)隊(duì)列中每一個(gè)元素都被分配到一個(gè)優(yōu)先權(quán)值,出隊(duì)順序按照優(yōu)先權(quán)值來劃分。一般有兩種出隊(duì)順序高優(yōu)先權(quán)出隊(duì)或低優(yōu)先權(quán)出隊(duì),想了解具體內(nèi)容的小伙伴可以參考下文內(nèi)容,希望對(duì)你有所幫助2021-12-12
Java中的CopyOnWriteArrayList容器解析
這篇文章主要介紹了Java中的CopyOnWriteArrayList容器解析,CopyOnWriteArrayList容器允許并發(fā)讀,讀操作是無鎖的,性能較高。至于寫操作,比如向容器中添加一個(gè)元素,則首先將當(dāng)前容器復(fù)制一份,然后在新副本上執(zhí)行寫操作,需要的朋友可以參考下2023-12-12
java遠(yuǎn)程調(diào)用接口、URL的方式代碼
我們都知道接口有自己本地的,也有遠(yuǎn)程別人寫好的,而調(diào)用遠(yuǎn)程接口的就需要使用遠(yuǎn)程調(diào)用啦,這篇文章主要給大家介紹了關(guān)于java遠(yuǎn)程調(diào)用接口、URL的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11
Java?Stream實(shí)現(xiàn)多字段分組groupingBy操作詳解
Stream是Java8的一個(gè)新特性,主要用戶集合數(shù)據(jù)的處理,如排序、過濾、去重等等功能,本文就來講講如何利用Stream實(shí)現(xiàn)比較優(yōu)雅的按多字段進(jìn)行分組groupingBy吧2023-06-06
MybatisPlus?BaseMapper?實(shí)現(xiàn)對(duì)數(shù)據(jù)庫增刪改查源碼
MybatisPlus?是一款在?Mybatis?基礎(chǔ)上進(jìn)行的增強(qiáng)?orm?框架,可以實(shí)現(xiàn)不寫?sql?就完成數(shù)據(jù)庫相關(guān)的操作,這篇文章主要介紹了MybatisPlus?BaseMapper?實(shí)現(xiàn)對(duì)數(shù)據(jù)庫增刪改查源碼解析,需要的朋友可以參考下2023-01-01

