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注入yml配置文件 list报错的解决方案
这篇文章主要介绍了springboot注入yml配置文件 list报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-08-08Eclipse中引入com.sun.image.codec.jpeg包报错的完美解决办法
Java开发中对图片的操作需要引入 com.sun.image.codec.jpeg,但有时引入这个包会报错,利用下面的操作可以完成解决这个问题2018-02-02一文吃透Spring Cloud gateway自定义错误处理Handler
这篇文章主要为大家介绍了一文吃透Spring Cloud gateway自定义错误处理Handler方法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-03-03
最新评论