在threadlocal中保持“当前用户”

时间:2013-08-14 07:50:25

标签: java spring-mvc thread-local

我有一个spring-mvc应用程序,目前有两个通道--Web应用程序和REST服务。两者都有用户的http会话,我可以很容易地在我的服务类中获得“当前用户”。

现在我需要开发另一个REST服务,其中没有http会话,当前用户依赖于请求参数。因此控制器将读取该请求参数并找到当前用户。

现在我要么: 1.修改我的服务层方法以接受当前用户作为参数 要么 2.只需修改从http会话中获取当前用户的类。

我还需要创建审核日志,我将使用Spring AOP。 Aspect也需要访问“当前用户”。因此选项#1可能对我不起作用,我会选择#2。

对于选项#2,我将创建一个拦截器,将当前用户放在ThreadLocal变量中。新REST服务的控制器将执行相同的操作,然后在我的服务层和审计日志方面,我可以从那里获得当前用户。

之前我没有做过这样的事情,并且想知道是否有更好的方法。或者这种方法我应该期待什么样的问题。

我将不胜感激任何评论和想法。

盎司

以下是我目前获得当前用户的方式:

@Override
public User getCurrentUser()
{
    Authentication currentUser = getAuthentication();

    return userService.getByLoginName(currentUser.getName());
}


protected Authentication getAuthentication()
{
    return SecurityContextHolder.getContext().getAuthentication();
}

1 个答案:

答案 0 :(得分:2)

我认为执行所需操作的一种简单方法是为新的REST Web服务配置servlet过滤器,以使用请求参数中的SecurityContextHolder对象构建填充Authentication

您可以阅读:http://static.springsource.org/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#d0e2171了解更多详情。

使用此解决方案,您无需修改​​代码即可检索当前用户。 (请注意,SecurityContextHolder已使用ThreadLocal来存储SecurityContext,因此Authentication