Spring security ExceptionMapingAuthenticationFailureHandler未重定向到登录页面

Spring security ExceptionMapingAuthenticationFailureHandler未重定向到登录页面,spring-security,Spring Security,我配置了一个ExceptionMappingAuthenticationFailureHandler,如下所示: @Bean(name = { "defaultAuthenticationFailureHandler", "authenticationFailureHandler" }) protected AuthenticationFailureHandler defaultAuthenticationFailureHandler() { Map<String, String&

我配置了一个ExceptionMappingAuthenticationFailureHandler,如下所示:

@Bean(name = { "defaultAuthenticationFailureHandler", "authenticationFailureHandler" })
protected AuthenticationFailureHandler defaultAuthenticationFailureHandler() {
    Map<String, String> exceptionMappings = new HashMap<>();
    exceptionMappings.put(InternalAuthenticationServiceException.class.getCanonicalName(), "/login?error=servererror");
    exceptionMappings.put(BadCredentialsException.class.getCanonicalName(), "/login?error=authfailed");
    exceptionMappings.put(CredentialsExpiredException.class.getCanonicalName(), "/login?error=credentialsExpired");
    exceptionMappings.put(LockedException.class.getCanonicalName(), "/login?error=locked");
    exceptionMappings.put(DisabledException.class.getCanonicalName(), "/login?error=disabled");
    exceptionMappings.put(AccessDeniedException.class.getCanonicalName(), "/login?error=denied");

    final ExceptionMappingAuthenticationFailureHandler result = new ExceptionMappingAuthenticationFailureHandler();
    result.setExceptionMappings(exceptionMappings);
    result.setDefaultFailureUrl("/login?error=default");
    return result;
}
@Bean(name={“defaultAuthenticationFailureHandler”,“authenticationFailureHandler”})
受保护的AuthenticationFailureHandler defaultAuthenticationFailureHandler(){
Map exceptionMappings=新HashMap();
exceptionMappings.put(InternalAuthenticationServiceException.class.getCanonicalName(),“/login?error=servererror”);
exceptionMappings.put(BadCredentialsException.class.getCanonicalName(),“/login?error=authfailed”);
exceptionMappings.put(CredentialsExpiredException.class.getCanonicalName(),“/login?error=credentialsExpired”);
exceptionMappings.put(LockedException.class.getCanonicalName(),“/login?error=locked”);
exceptionMappings.put(DisabledException.class.getCanonicalName(),“/login?error=disabled”);
exceptionMappings.put(AccessDeniedException.class.getCanonicalName(),“/login?error=denied”);
最终ExceptionMapingAuthenticationFailureHandler结果=新ExceptionMapingAuthenticationFailureHandler();
结果。设置例外映射(例外映射);
result.setDefaultFailureUrl(“/login?error=default”);
返回结果;
}

我还有一个自定义AuthenticationProvider,它根据错误抛出InternalAuthenticationServiceException或BadCredentialsException。所以现在我进入登录页面,尝试使用无效的用户名/密码登录。我开始调试它,可以在ExceptionMappingAuthenticationFailureHandler中看到它重定向到正确的URL,但随后流转到ExceptionTranslationFilter第168行,在该行中an处理AccessDeniedException(不知道为什么会引发)再次调用ExceptionMapingAuthenticationFailureHandler,但这次它重定向到“/login”,因此最终我被重定向到“/login”,而不是“/login?error=authfailed”

,正如Rob指出的formLogin()。permitAll()要求查询字符串完全匹配(在本例中是/login?error)。因此,您需要使用authorizeRequests().antMatcher(“/login”).permitAll()来确保授予访问权限

听起来好像他重定向正在工作,但您重定向到的URL没有标记为permitAll。尝试确保用于处理错误的URL标记为permitAll。嗨,Rob,我调试了它,似乎请求URL第168行(第二次)再次是
/login?error=servererror
,因此似乎不允许使用此URL。但这怎么可能呢,我有:.loginProcessingUrl(“/j_spring\u security\u check”).loginPage(“/login”).defaultSuccessUrl(“/console”).failureHandler(defaultAuthenticationFailureHandler()).permitAll(),所以如果我打开/login,我可以看到登录页面。如果我手动转到/login?error=servererror,我将被重定向到/login.formLogin()。permitAll()要求查询字符串是完全匹配的(在本例中是/login?error)。因此,您需要使用authorizeRequests().antMatcher(“/login”).permitAll()来确保授予访问权限。嗨,Rob,它成功了!然而,我仍然相信第36行的ExceptionMappingAuthenticationFailureHandler中存在一个bug-因为这个FailureHandler扩展了SimpleRuThenticationFailureHandler,您可以在第36行设置useForward属性,我们缺少一个if语句来检查用户是否选择转发或重定向。再次感谢您的帮助:)