我有一个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();
}
答案 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
)