使用spring security获取服务层中的登录用户

und*_*dog 3 java spring spring-mvc spring-security spring-integration

我在服务层有一个异步方法,它从队列中读取消息.我需要将收到的消息发送给当前登录用户的订阅者.

在我的控制器中,我将用户取为

(CustomUserDetail)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
Run Code Online (Sandbox Code Playgroud)

哪个工作正常,但服务层中的相同代码抛出一个 NullPointerException.可能是因为SecurityContextHolder没有在同一个请求响应流中调用而是异步,但同时我认为Spring Security会在会话中保留所有用户安全数据.所以它应该工作正常.

任何人都可以建议解决方法.如何在服务层中获取登录用户?

我觉得一种可能的方法是,当控制器方法将消息推送到队列然后从服务层中的会话中检索用户时,可以将活动用户添加到会话中.

nes*_*ion 6

Spring SecurityContextHolder默认模式是MODE_THREADLOCALSecurityContextHolder仅在相同的执行线程中可用.

将其更改为MODE_INHERITABLETHREADLOCAL,应该允许您访问SecurityContextHolder所有生成的线程.

SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL)

应该解决你的问题.