0

我有一个 spring-mvc 应用程序,它当前有两个通道——Web 应用程序和一个 REST 服务。两者都有用户的 http 会话,我可以轻松地在我的服务类中获取“当前用户”。

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

现在我要么需要: 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();
}
4

1 回答 1

2

我认为做你需要的一个简单的方法是为你的新 REST web 服务配置一个 servlet 过滤器,以使用来自请求参数SecurityContextHolder的对象构建来填充。Authentication

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

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

于 2013-08-14T10:32:13.747 回答