【发布时间】:2011-10-28 02:13:52
【问题描述】:
用户的权限在我的网络服务中经常更改。
在这种情况下,如何有效地检查用户的权限?
我编写了临时检查每个控制器中用户权限的代码。 但我认为这种方式不利于维护。
如何在每个控制器不写检查方法的情况下检查用户的权限?
【问题讨论】:
-
你也可以在这里使用漂亮的包装器:stackoverflow.com/a/3412166/26510
用户的权限在我的网络服务中经常更改。
在这种情况下,如何有效地检查用户的权限?
我编写了临时检查每个控制器中用户权限的代码。 但我认为这种方式不利于维护。
如何在每个控制器不写检查方法的情况下检查用户的权限?
【问题讨论】:
不确定您在做什么 - Spring Security 自动跟踪用户安全上下文中的权限。如果出于其他原因需要编程检查,则实现HandlerInterceptor接口,并在preHandle方法中调用SecurityContextHolder.getContext().getAuthentication()获取当前用户。然后您可以检查用户的权限。
拦截器的配置如下:
<mvc:interceptors>
<bean class="com.my.package.MyInterceptor" />
</mvc:interceptors>
【讨论】:
将intercept-url 元素添加到您的配置中,并使用所需的角色,例如。
<http auto-config='true'>
<intercept-url pattern="/**" access="ROLE_FOO" />
</http>
【讨论】:
使用HandlerMethodArgumentResolver让Spring在控制器方法中注入GrantedAuthority。如果一个用户可以拥有多个权限,那么您将需要创建一个类来保存用户的权限(可以命名为GrantedAuthorities)。完成后,您的控制器方法将如下所示:
@RequestMapping({"/xyz"})
public String handleXYZRequest(GrantedAuthorities authorities) {
/* use authorities if not null */
...
}
在解析器中,您将使用当前用于获取权限的相同代码,它将返回 null 或 GrantedAuthorities 对象。如果您使用的是旧版本的 Spring,请使用 WebArgumentResolver 并将其注册到 AnnotationMethodHandlerAdapter。
上述方法避免了代码重复,它可用于在控制器方法中从SecurityContextHolder 注入您需要的任何内容。
编辑
这类似于温室使用的方法。请参阅WebConfig,其中主体(即 Account 对象)通过参数解析器注入控制器。
【讨论】: