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传入到子线程

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot集成canal实现示例解析

    SpringBoot集成canal实现示例解析

    这篇文章主要为大家介绍了springboot整合canal的示例实现解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多多进步,早日升职加薪
    2022-02-02
  • SpringBoot中@ComponentScan的使用详解

    SpringBoot中@ComponentScan的使用详解

    这篇文章主要介绍了SpringBoot中@ComponentScan的使用详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • RabbitMQ之消息的可靠性方案详解

    RabbitMQ之消息的可靠性方案详解

    这篇文章主要介绍了RabbitMQ之消息的可靠性方案详解,MQ 消息数据完整的链路为:从 Producer 发送消息到 RabbitMQ 服务器中,再由 Broker 服务的 Exchange 根据 Routing_Key 路由到指定的 Queue 队列中,最后投送到消费者中完成消费,需要的朋友可以参考下
    2023-08-08
  • java synchronized的用法及原理详解

    java synchronized的用法及原理详解

    如果要保证并发情况下多线程共享数据的访问安全,操作的原子性,就可以使用synchronized关键字。这篇文章主要介绍了java synchronized的用法及原理,需要的朋友可以借鉴一下
    2021-08-08
  • SpringAOP四种通知类型+环绕通知说明

    SpringAOP四种通知类型+环绕通知说明

    这篇文章主要介绍了SpringAOP四种通知类型+环绕通知说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java Scanner对象中hasNext()与next()方法的使用

    Java Scanner对象中hasNext()与next()方法的使用

    这篇文章主要介绍了Java Scanner对象中hasNext()与next()方法的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Java实现顺序表的操作

    Java实现顺序表的操作

    这篇文章主要为大家详细介绍了Java实现顺序表的基本操作,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • 详解Spring Security的Web应用和指纹登录实践

    详解Spring Security的Web应用和指纹登录实践

    这篇文章主要介绍了详解Spring Security的Web应用和指纹登录实践,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • Android开发简单计算器实现代码

    Android开发简单计算器实现代码

    这篇文章主要介绍了Android开发简单计算器实现,本文放置了完整的Android开发电脑,通过部署项目可以直接按到效果,希望本篇文章可以对你有所帮助
    2021-06-06
  • SpringSecurity实现动态加载权限信息的方法

    SpringSecurity实现动态加载权限信息的方法

    这篇文章主要介绍了SpringSecurity实现动态加载权限信息,本文给大家介绍的非常详细,对大家的学习或工作具有一定需要的朋友可以参考下
    2022-01-01

最新评论