Async Spring Listeners中的SecurityUser

时间:2016-02-25 13:05:25

标签: java spring asynchronous listener security-context

我正面临一个问题,希望有人可以给我一些建议。 我有一个宁静的Spring应用程序,它允许HTTP请求。我正在使用spring security并提供oauth2。在我的基本服务中,由控制器调用,我通过以下方式获取当前登录的用户:

SecurityUser loggedUser = (SecurityUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();

到目前为止,这一切都正常。此外,我正在使用实现org.springframework.context.ApplicationListener接口的事件和事件侦听器。我将应用程序事件多播器配置为异步处理事件的方式(使用SimpleAsyncTaskExecutor)。

当我尝试在我的监听器中使用我的服务(以及依赖当前登录用户的方法)时,会出现(明显的)问题。他们无法访问上下文,因为他们正在异步工作。因此,我无法获取当前用户。

您能否提出如何解决问题的建议?是否有比

更多的选择
  • 以某种方式保存和扩展上下文,以便异步侦听器可以 仍然访问它?如果是的话,该怎么做?
  • 更改所有服务方法以通过参数移交用户 (而不是获取当前用户本身的服务)并存储 它的id例如在活动中。

非常感谢你。自己

1 个答案:

答案 0 :(得分:0)

您可以使用DelegatingSecurityContextAsyncTaskExecutor而不是SimpleAsyncTaskExecutor。问题是您只能在用户登录时获取用户的上下文。