java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > spring security获取用户信息为null或者串值

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

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

总结

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

您可能感兴趣的文章:
阅读全文