Я настроил ExceptionMappingAuthenticationFailureHandler так: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;
}
У меня также есть собственный AuthenticationProvider, который бросает InternalAuthenticationServiceException или BadCredentialsException в зависимости от ошибки. Итак, теперь я перехожу на страницу входа в систему и пытаюсь войти с неправильным именем пользователя/паролем. Я начинаю отлаживать его, и я вижу, что он находится в ExceptionMappingAuthenticationFailureHandler, где он перенаправляется на правильный URL-адрес, но затем поток переходит в строку ExceptionTranslationFilter 168, где обрабатывается AccessDeniedException (не знаю, почему он был поднят), и вызывается ExceptionMappingAuthenticationFailureHandler снова но на этот раз он перенаправляется на «/ login», поэтому в конце я перенаправлен на «/ login» вместо «/ login? error = authfailed»
Похоже, что он перенаправляется, но URL-адрес, на который вы перенаправляете, не помечен как allowAll. Попробуйте убедиться, что URL-адреса для обработки ошибок отмечены как allowAll. –
Привет, Роб, я отлаживал его, и кажется, что строка ExceptionTranslationFilter 168 (второй раз) URL-адрес запроса снова '/ login? Error = servererror', поэтому кажется, что этот URL-адрес не разрешен. Но как это может быть, у меня есть: .loginProcessingUrl ("/ j_spring_security_check") .loginPage ("/ Логин") .defaultSuccessUrl ("/ консоль") .failureHandler (defaultAuthenticationFailureHandler()) .permitAll() поэтому, если я открываю/регистрирую, я могу видеть страницу входа. Если я вручную перейду в/login? Error = servererror, я перенаправлен в/login. –
formLogin(). AllowAll() требует, чтобы строка запроса была точным совпадением (в этом случае это была бы ошибка/login?). Поэтому вам необходимо использовать authorizeRequests(). AntMatcher ("/ login"). AllowAll() для обеспечения доступа. –