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(() -> {
//獲取用戶對象
LoginUserDetails userDetails = (LoginUserDetails)SecurityContextHolder.getContext()
.getAuthentication().getPrincipal();
});
//改進后
ExecutorService executorService = Executors.newCachedThreadPool(new ThreadFactoryBuilder().setNameFormat("job").build());
SecurityContext securityContext = SecurityContextHolder.getContext();
executorService.execute(() -> {
//把context設置進去
SecurityContextHolder.setContext(securityContext);
//獲取用戶對象
LoginUserDetails userDetails = (LoginUserDetails)SecurityContextHolder.getContext()
.getAuthentication().getPrincipal();
});

源碼:

ThreadLocal是線程獨有的局部變量
只針對當前線程,當前代碼里使用了嵌套線程
子線程里的SecurityContext和父線程里的SecurityContext不是同一個
需要從父線程把SecurityContext傳入到子線程
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Java中的CopyOnWriteArrayList容器解析
這篇文章主要介紹了Java中的CopyOnWriteArrayList容器解析,CopyOnWriteArrayList容器允許并發(fā)讀,讀操作是無鎖的,性能較高。至于寫操作,比如向容器中添加一個元素,則首先將當前容器復制一份,然后在新副本上執(zhí)行寫操作,需要的朋友可以參考下2023-12-12
Java?Stream實現(xiàn)多字段分組groupingBy操作詳解
Stream是Java8的一個新特性,主要用戶集合數(shù)據(jù)的處理,如排序、過濾、去重等等功能,本文就來講講如何利用Stream實現(xiàn)比較優(yōu)雅的按多字段進行分組groupingBy吧2023-06-06
MybatisPlus?BaseMapper?實現(xiàn)對數(shù)據(jù)庫增刪改查源碼
MybatisPlus?是一款在?Mybatis?基礎上進行的增強?orm?框架,可以實現(xiàn)不寫?sql?就完成數(shù)據(jù)庫相關的操作,這篇文章主要介紹了MybatisPlus?BaseMapper?實現(xiàn)對數(shù)據(jù)庫增刪改查源碼解析,需要的朋友可以參考下2023-01-01

