0

一年以来,我一直在研究 Spring 安全性。今天我遇到了一个关于 Spring Security 授权的小问题

对于拦截网址,我已经像这样配置了我的 spring-security.xml

<intercept-url method="GET" pattern="/groups" access="hasRole('VIEW_GROUPS')" />

<intercept-url method="GET" pattern="/admin" access="hasRole('VIEW_ADMIN')" />

这可能会发生在用户没有角色查看 /groups 页面的情况下,那么在这种情况下,我如何确保用户自动重定向到 /admin 页面?

我知道答案很简单,但我被困在这里。

4

1 回答 1

2

您可以在拒绝访问处理程序中进行重定向。

通常你的配置中会有这样的东西:

<http ..... >
  ...
  <intercept-url method="GET" pattern="/groups" access="hasRole('VIEW_GROUPS')" />
  <intercept-url method="GET" pattern="/admin" access="hasRole('VIEW_ADMIN')" />
  ...
  <access-denied-handler error-page="/access-denied" />
</http>

URL /access-denied 通常显示拒绝访问页面。您可以将控制器注册到该 URL,然后如果用户具有角色“VIEW_ADMIN”,则可以签入控制器并将他重定向到那里。如果您需要知道用户试图访问哪个 URL,它应该在 HttpServletRequest 对象中可用。

编辑:通过拦截器的解决方案:

您可以创建一个 Spring MVC 拦截器。扩展 HandlerInterceptorAdapter 并在 preHandle 方法中检查用户是否已通过身份验证并检查角色并执行重定向。

class MyRoleBasedRedirectorInterceptor extends HandlerInterceptorAdapter {

   @Override
   public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
       //do the authentication/role/URL checks
       ...
       if (needsAdminRedirect) {
           response.sendRedirect("admin");
           return false;
       }
       return true;
   }

}

在配置中:

<mvc:interceptors>
    <bean class="com.example.MyRoleBasedRedirectorInterceptor" />
</mvc:interceptors>

如果您不喜欢原始控制器解决方案,您还可以实现自己的 AccessDeniedHandler 实现并在那里进行检查。您将使用

<access-denied-handler ref="com.example.MyAccessDeniedHandler" />

我仍然会选择 Controller / AccessDeniedHandler 解决方案,因为如果我理解正确,重定向仅在用户无权访问“组”页面时发生。

于 2013-09-03T16:35:35.500 回答