在spring3控制器方法中检查用户当前权限的最佳方法是什么?

时间:2011-08-16 13:45:03

标签: spring-security authority

我的网络服务经常更改用户的权限 在这种情况下,我如何有效地检查用户的权限?

我编写的代码可以临时检查用户在每个控制器中的权限。 但我认为这种方式不利于维护。

如何在不在每个控制器中编写检查方法的情况下检查用户的权限?

3 个答案:

答案 0 :(得分:1)

不确定您在做什么 - Spring Security会自动跟踪用户安全上下文中的权限。如果您需要以编程方式检查其他原因,请实现HandlerInterceptor接口,并在preHandle方法中调用SecurityContextHolder.getContext().getAuthentication()以获取当前用户。然后,您可以检查用户的权限。

拦截器的配置如下:

<mvc:interceptors>
    <bean class="com.my.package.MyInterceptor" />
</mvc:interceptors>

答案 1 :(得分:0)

使用所需的角色为您的配置添加intercept-url元素,例如

<http auto-config='true'>
  <intercept-url pattern="/**" access="ROLE_FOO" />
</http>

答案 2 :(得分:0)

使用HandlerMethodArgumentResolver让Spring在控制器方法中注入GrantedAuthority。如果用户可以拥有多个权限,那么您将需要创建一个类来保存用户的权限(可以命名为GrantedAuthorities)。完成后,您的控制器方法将如下所示:

@RequestMapping({"/xyz"})
public String handleXYZRequest(GrantedAuthorities authorities) {
    /* use authorities if not null */
    ...
}

在解析器中,您将使用当前用于获取权限的相同代码,它将返回null或GrantedAuthorities对象。如果您使用的是旧版本的Spring,请使用WebArgumentResolver并将其注册到AnnotationMethodHandlerAdapter。

以上方法避免了代码的重复,它可以用于从控制器方法中SecurityContextHolder注入任何需要的东西。

修改

这类似于温室使用的方法。请参阅WebConfig,其中principal(即Account对象)通过参数解析器注入控制器。