2014-09-11 4 views
1

Я настроил 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»

+0

Похоже, что он перенаправляется, но URL-адрес, на который вы перенаправляете, не помечен как allowAll. Попробуйте убедиться, что URL-адреса для обработки ошибок отмечены как allowAll. –

+0

Привет, Роб, я отлаживал его, и кажется, что строка ExceptionTranslationFilter 168 (второй раз) URL-адрес запроса снова '/ login? Error = servererror', поэтому кажется, что этот URL-адрес не разрешен. Но как это может быть, у меня есть: .loginProcessingUrl ("/ j_spring_security_check") .loginPage ("/ Логин") .defaultSuccessUrl ("/ консоль") .failureHandler (defaultAuthenticationFailureHandler()) .permitAll() поэтому, если я открываю/регистрирую, я могу видеть страницу входа. Если я вручную перейду в/login? Error = servererror, я перенаправлен в/login. –

+1

formLogin(). AllowAll() требует, чтобы строка запроса была точным совпадением (в этом случае это была бы ошибка/login?). Поэтому вам необходимо использовать authorizeRequests(). AntMatcher ("/ login"). AllowAll() для обеспечения доступа. –

ответ

1

Как писал Rob, formLogin(). allowAll() требует, чтобы строка запроса должна быть точным совпадением (в этом случае это будет ошибка/login?). Поэтому вам необходимо использовать authorizeRequests(). AntMatcher («/ login»). AllowAll() для обеспечения доступа

Смежные вопросы