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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值