使用Forward的Spring Security Error页面

时间:2012-10-03 02:28:11

标签: spring security

我想在身份验证拒绝(我使用预先验证的secnario)上显示自定义错误页面,并且还从Spring Security 3.0.X访问拒绝

了解我们可以使用以下方法执行此操作:

                      

<beans:bean id="authenticationEntryPoint" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
    <beans:property name="loginFormUrl" value="/error.jsp"/>
</beans:bean>

<beans:bean id="accessDeniedHandler" class="org.springframework.security.web.access.AccessDeniedHandlerImpl">
    <beans:property name="errorPage" value="/error.jsp"/>
</beans:bean>

但这样做会导致重定向,而不是转发到错误页面。无论如何要执行转发到错误页面(以便我们可以在请求中设置一些属性)

谢谢

1 个答案:

答案 0 :(得分:3)

在我的security-context.xml中,对于身份验证失败,我确实喜欢这个(注意authentication-failure-url属性):

    <security:form-login login-page="/auth/login"
        authentication-failure-url="/auth/login?error=true"
        default-target-url="/mvc/home"
        always-use-default-target="true" />

对于拒绝访问,我使用此:

    <security:access-denied-handler error-page="/auth/access-denied"/>

<security:http use-expressions="true">内的两个标签。对我而言,就像魅力一样,我不知道为什么当你提供易于使用的漂亮标签时,你试图以你的方式配置它。

我不知道它是否回答了你的问题,我希望它有所帮助。

修改

使用上面提供的配置意味着您在后台使用默认身份验证失败处理程序(SimpleUrlAuthenticationFailureHandler)。您可以通过更改属性forwardToDestination值来更改默认行为(默认情况下,在生成失败的身份验证时执行重定向)。这就是SimpleUrlAuthenticationFailureHandler所做的:

/**
 * Performs the redirect or forward to the {@code defaultFailureUrl} if set, otherwise returns a 401 error code.
 * <p>
 * If redirecting or forwarding, {@code saveException} will be called to cache the exception for use in
 * the target view.
 */
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
        AuthenticationException exception) throws IOException, ServletException {

    if (defaultFailureUrl == null) {
        logger.debug("No failure URL set, sending 401 Unauthorized error");

        response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Authentication Failed: " + exception.getMessage());
    } else {
        saveException(request, exception);

        if (forwardToDestination) {
            logger.debug("Forwarding to " + defaultFailureUrl);

            request.getRequestDispatcher(defaultFailureUrl).forward(request, response);
        } else {
            logger.debug("Redirecting to " + defaultFailureUrl);
            redirectStrategy.sendRedirect(request, response, defaultFailureUrl);
        }
    }
}

所以我想我在你的SimpleUrlAuthenticationFailureHandler中声明了你的security-context.xml,并使用它应该有效的setUseForward(boolean forwardToDestination)方法设置了提到的属性值。可能是这样的:

<bean id="simpleUrlAuthenticationFailureHandler" class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler">
    <property name="useForward" value="true">
</bean>

然后:

    <security:form-login login-page="/auth/login"
        authentication-failure-handler-ref="simpleUrlAuthenticationFailureHandler"
        default-target-url="/mvc/home"
        always-use-default-target="true" />
祝你好运。