2015-01-01 3 views
3

Редактировать: разрешено. Посмотреть мой комментарий после этого сообщенияSpring AuthenticationFailureHandler и WebSecurityConfigurerAdapter loginPage()

В настоящее время я реализую веб-приложение с Spring-Security. Я внедрил пользовательский код AuthenticationFailureHandler, который проверяет, слишком ли часто пытался войти в систему с неправильными учетными данными (и блокирует его для серверных минут). Но нормальные неудачные логины должны перенаправлять пользователя на страницу входа с ошибкой параметра (/login?error). На этой странице отображается сообщение об ошибке, как «Пароль, который вы набрали в ошиблась»

AutenticationFailureHandler выглядит следующим образом (без uninteressting Linse кода)

public class CustomAuthenticationHandler implements AuthenticationFailureHandler { 
// Some variables 

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

// some logic here.. 

request.setAttribute("param", "error"); 
response.sendRedirect("/login?error"); 

} 

Мой класс WebApplicationSecurity выглядит следующим образом:

@Configuration 
@EnableWebMvcSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

@Autowired 
CustomAuthenticationHandler customAuthenticationHandler; 

@Override 
protected void configure(HttpSecurity http) throws Exception { 

    http.formLogin() 
     .loginPage("/login") 
     .permitAll() 
     .failureHandler(customAuthenticationHandler) 
     .and() 
     .logout() 
     .permitAll(); 

    http.authorizeRequests() 
     .antMatchers("/css/**", "/img/**", "/js/**") 
     .permitAll() 
     .anyRequest() 
     .authenticated(); 

    http 
     .csrf() 
     .disable(); 
} 

@Bean 
CustomAuthenticationHandler authenticationHandler() { 
    return new CustomAuthenticationHandler(); 
} 

@Configuration 
protected static class AuthenticationConfiguration extends 
     GlobalAuthenticationConfigurerAdapter { 

    @Override 
    public void init(AuthenticationManagerBuilder auth) throws Exception { 
     auth.inMemoryAuthentication() 
      .withUser("*******") 
      .password("*******") 
      .roles("USER"); 
    } 
} 
} 

Проблема в том, что AuthenticationFailureHandler перенаправляет на /login?error, но (я не знаю, почему) другой перенаправление делается до /login.

Помогите мне решить мою проблему?

+0

ли вы случайно вызвать super.onAuthenticationFailure в любой момент? Может ли Spring автоматически делать это по какой-то причине? – kaqqao

+1

Ну, я решил это, добавив «/ login **» в 'http.authorizeRequests(). AntMatchers ("/css/** ","/img/** ","/js/** ")' – smsnheck

+0

О, так логин сам (с параметрами) не был доступен ... Самая старая ошибка в книге:/ – kaqqao

ответ

3

Ну, я решил ее путем добавления «/ логин **» в http.authorizeRequests().antMatchers("/css/**", "/img/**", "/js/**")

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