我的春季安全配置:
<security:http auto-config="true" use-expressions="true" >
<security:intercept-url pattern="/game/**" access="isAuthenticated()"/>
<security:intercept-url pattern="/**" access="permitAll"/>
<security:form-login password-parameter="password" username-parameter="username" login-page="/"
default-target-url="/game/" login-processing-url="/processLogin" authentication-failure-url="/"/>
<security:logout logout-url="/game/logout" logout-success-url="/" delete-cookies="true" invalidate-session="true"/>
<security:access-denied-handler ref="accessDeniedHandler" />
</security:http>
自定义处理程序:
@Component
public class AccessDeniedHandler extends AccessDeniedHandlerImpl {
@Override
public void handle(HttpServletRequest request,
HttpServletResponse response, AccessDeniedException exception)
throws IOException, ServletException {
super.handle(request, response, exception);
}
}
异常解析器:
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key=".AccessDeniedException">accessDenied</prop>
</props>
</property>
</bean>
我遇到的问题是Spring安全性不会引发任何异常。例如,当我输入受保护的URL时,它会将我重定向到登录页面。如果我从配置中删除登录页面,它会将我重定向到spring security default login form。因此,我无法处理任何异常,如AccessDeniedException。正如您在上面所看到的,我已经定义了自定义访问被拒绝处理程序,它会覆盖句柄方法,但它甚至不会进入它。我也尝试使用SimpleMappingExceptionResolver,但这也不起作用。 所以我的问题是:如何使弹簧安全抛出异常,以便我可以通过解析器或自定义处理程序捕获它们?
答案 0 :(得分:3)
我的AccessDeniedHandler无法正常工作的原因是因为它仅适用于经过身份验证的用户,因此当未经身份验证的用户尝试仅为经过身份验证的用户访问内容时,为了显示错误页面(这是尝试捕获AccessDeniedException),您应该编写自定义入口点,并覆盖默认入口点。
感谢 Luke Taylor 向我澄清这一点。