在spring mvc中未授权intercept-url时重定向

时间:2013-09-03 05:15:24

标签: java spring spring-mvc spring-security

我一年以来一直在研究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')" />

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

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

1 个答案:

答案 0 :(得分: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解决方案,因为如果我理解正确,只有在用户无权访问“群组”页面时才会重定向。