spring security获取用户信息为null或者串值的解决
spring security获取用户信息为null或串值
在spring security,用SecurityContextHolder.getContext().getAuthentication().getPrincipal()获取登录用户的信息
发现获取到的用户有串值现象——获取用户信息
发现获取到的是别人的信息,偶发性还有取值为null的情况
问题的原因
经同事提醒,是不是用了多线程,查到了问题的原因。
//原代码
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传入到子线程
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
Java中的CopyOnWriteArrayList容器解析
这篇文章主要介绍了Java中的CopyOnWriteArrayList容器解析,CopyOnWriteArrayList容器允许并发读,读操作是无锁的,性能较高。至于写操作,比如向容器中添加一个元素,则首先将当前容器复制一份,然后在新副本上执行写操作,需要的朋友可以参考下2023-12-12
Java Stream实现多字段分组groupingBy操作详解
Stream是Java8的一个新特性,主要用户集合数据的处理,如排序、过滤、去重等等功能,本文就来讲讲如何利用Stream实现比较优雅的按多字段进行分组groupingBy吧2023-06-06
MybatisPlus BaseMapper 实现对数据库增删改查源码
MybatisPlus 是一款在 Mybatis 基础上进行的增强 orm 框架,可以实现不写 sql 就完成数据库相关的操作,这篇文章主要介绍了MybatisPlus BaseMapper 实现对数据库增删改查源码解析,需要的朋友可以参考下2023-01-01


最新评论