我一年以来一直在研究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页面?
我知道答案很简单,但我被困在这里。
答案 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解决方案,因为如果我理解正确,只有在用户无权访问“群组”页面时才会重定向。