3

我想在身份验证拒绝时显示一个自定义错误页面(我正在使用预身份验证的 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>

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

谢谢

4

1 回答 1

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">。对我来说就像一个魅力,当 Spring 提供了如此易于使用的好标签时,我不知道你为什么要尝试以你正在做的方式配置它。

不知道能不能回答你的问题,希望对你有帮助。

编辑:

使用上面提供的配置,意味着您在后台使用默认的身份验证失败处理程序 ( 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" />

祝你好运。

于 2012-10-03T09:10:31.680 回答