spring security获取用户信息为null或者串值的解决

 更新时间:2024年03月22日 14:22:35   作者:9随遇而安  
这篇文章主要介绍了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按字节读取文件的简单实例

    JAVA按字节读取文件的简单实例

    下面小编就为大家带来一篇JAVA按字节读取文件的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • idea手动刷新git分支的详细教程

    idea手动刷新git分支的详细教程

    这篇文章主要介绍了idea手动刷新git分支,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • Java使用String类格式化当前日期实现代码

    Java使用String类格式化当前日期实现代码

    这篇文章主要介绍了Java使用String类格式化当前日期实现代码,需要的朋友可以参考下
    2014-02-02
  • SpringCloud和Spring Cloud Alibaba的使用及区别说明

    SpringCloud和Spring Cloud Alibaba的使用及区别说明

    SpringCloud和SpringCloudAlibaba都是基于SpringFramework的分布式系统开发框架,但它们分别来自不同的社区和生态,功能上有一些区别,以下是它们的主要差异
    2026-01-01
  • 详解Java-Jackson使用

    详解Java-Jackson使用

    这篇文章主要介绍了Java-Jackson使用详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • SpringBoot实现多租户系统架构的5种设计方案介绍

    SpringBoot实现多租户系统架构的5种设计方案介绍

    多租户(Multi-tenancy)是一种软件架构模式,允许单个应用实例服务于多个客户(租户),同时保持租户数据的隔离性和安全性,本文分享了SpringBoot环境下实现多租户系统的5种架构设计方案,需要的可以参考一下
    2025-05-05
  • 解决springboot依赖包中报错unknown的问题

    解决springboot依赖包中报错unknown的问题

    这篇文章主要介绍了解决springboot依赖包中报错unknown的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Quartz作业调度基本使用详解

    Quartz作业调度基本使用详解

    这篇文章主要为大家介绍了Quartz作业调度基本使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • SpringBoot发送短信验证码的实例

    SpringBoot发送短信验证码的实例

    第三方短信发送平台有很多种,各个平台有各自的优缺点,在选择的时候可以根据自己的具体实际情况定夺,本文主要介绍了SpringBoot发送短信验证码的实例,感兴趣的可以了解一下
    2022-02-02
  • 新手入门Jvm-- JVM对象创建与内存分配机制

    新手入门Jvm-- JVM对象创建与内存分配机制

    JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的
    2021-06-06

最新评论