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設(shè)置進去 SecurityContextHolder.setContext(securityContext); //獲取用戶對象 LoginUserDetails userDetails = (LoginUserDetails)SecurityContextHolder.getContext() .getAuthentication().getPrincipal(); });
源碼:
ThreadLocal是線程獨有的局部變量
只針對當前線程,當前代碼里使用了嵌套線程
子線程里的SecurityContext和父線程里的SecurityContext不是同一個
需要從父線程把SecurityContext傳入到子線程
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java日期轉(zhuǎn)換注解配置date?format時間失效
這篇文章主要為大家介紹了Java日期轉(zhuǎn)換注解配置date?format時間失效,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12Java中的CopyOnWriteArrayList容器解析
這篇文章主要介紹了Java中的CopyOnWriteArrayList容器解析,CopyOnWriteArrayList容器允許并發(fā)讀,讀操作是無鎖的,性能較高。至于寫操作,比如向容器中添加一個元素,則首先將當前容器復(fù)制一份,然后在新副本上執(zhí)行寫操作,需要的朋友可以參考下2023-12-12Java?Stream實現(xiàn)多字段分組groupingBy操作詳解
Stream是Java8的一個新特性,主要用戶集合數(shù)據(jù)的處理,如排序、過濾、去重等等功能,本文就來講講如何利用Stream實現(xiàn)比較優(yōu)雅的按多字段進行分組groupingBy吧2023-06-06MybatisPlus?BaseMapper?實現(xiàn)對數(shù)據(jù)庫增刪改查源碼
MybatisPlus?是一款在?Mybatis?基礎(chǔ)上進行的增強?orm?框架,可以實現(xiàn)不寫?sql?就完成數(shù)據(jù)庫相關(guān)的操作,這篇文章主要介紹了MybatisPlus?BaseMapper?實現(xiàn)對數(shù)據(jù)庫增刪改查源碼解析,需要的朋友可以參考下2023-01-01