使用Spring将重定向设置为自定义身份验证失败处理程序

时间:2014-04-28 13:58:07

标签: spring spring-security

在Spring中将重定向设置为自定义AuthenticationFailureHandler的正确方法是什么?

是否可以调用控制器?

代码如下:

@Component
public class MyAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler {

    @Override
    public void onAuthenticationFailure(HttpServletRequest request,
            HttpServletResponse response, AuthenticationException exception)
            throws IOException, ServletException {
        super.onAuthenticationFailure(request, response, exception);

        if (exception.getClass().isAssignableFrom(
                CustomUsernameNotFoundException.class)) {

            // TODO Set the redirect

        }
    }

}

4 个答案:

答案 0 :(得分:4)

尝试这样的事情

public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
        saveException(request, exception);
        //do your things
        getRedirectStrategy().sendRedirect(request, response, "/page/login?error=Retry");
}

答案 1 :(得分:2)

您正在调用super.onAuthenticationFailure,这将重定向到已配置的网址。因此响应已经提交,您无法决定在其他地方重定向。

您可以将SimpleUrlAuthenticationFailureHandler配置为重定向到一个网址,如果您不打算自行重定向,则只调用超级方法。

或者,直接实现AuthenticationFailureHandler并在失败方法中实现所需的所有逻辑 - 一旦事情超出一定程度的复杂性,我宁愿完全避免继承:

if (oneCondition) {
    // redirect to IdP

} else {
    // redirect to registration page
}

答案 2 :(得分:0)

你可以调用一个控制器。,你的代码片段会有帮助,但是从这里讨论的例子中得到这个。

Spring Security Tutorial

@RequestMapping(value = "/login/failure")
public String loginFailure() {
    String message = "Login Failure!";
    return "redirect:/login?message="+message;
}

通过查看xml

中的登录映射,确保了解重定向的工作原理

Spring Mapping.xml

答案 3 :(得分:-1)

您可以重定向到特定网址。

response.sendRedirect("/redirect");