Рубрики
Без рубрики

Spring Security Custom AuthenticationFailureHandler

Узнайте, как настроить обработчик сбоя проверки подлинности приложения с помощью интерфейса AuthenticationFailureHandler Spring.

Автор оригинала: Daniel Barrigas.

1. Обзор

В этом кратком руководстве мы проиллюстрируем, как настроить обработку сбоев аутентификации Spring Security в приложении Spring Boot. Цель состоит в том, чтобы аутентифицировать пользователей, используя логин формы подход .

Для ознакомления с Spring Security и Формой входа в Spring Boot , пожалуйста, обратитесь к этой и этой статье соответственно.

2. Аутентификация и авторизация

Аутентификация и Авторизация часто используются в сочетании, поскольку они играют важную и не менее важную роль, когда речь заходит о предоставлении доступа к системе.

Однако они имеют разные значения и применяют разные ограничения при проверке запроса:

  • Аутентификация – предшествует Авторизации; речь идет о проверке полученных учетных данных; здесь мы проверяем, что имя пользователя и пароль совпадают с теми, которые распознает наше приложение
  • Авторизация речь идет о проверке наличия у успешно прошедшего проверку пользователя разрешений на доступ к определенной функциональности приложения

Мы можем настроить как аутентификацию , так и авторизацию обработку сбоев, однако в этом приложении мы сосредоточимся на сбоях аутентификации.

3. АутентификацияFailureHandler Spring Security

Spring Security предоставляет компонент, который по умолчанию обрабатывает сбои аутентификации для нас.

Однако нередко мы оказываемся в ситуации, когда поведение по умолчанию недостаточно для удовлетворения требований.

Если это так, мы можем создать свой собственный компонент и обеспечить желаемое пользовательское поведение, реализовав интерфейс AuthenticationFailureHandler :

public class CustomAuthenticationFailureHandler 
  implements AuthenticationFailureHandler {
 
    private ObjectMapper objectMapper = new ObjectMapper();

    @Override
    public void onAuthenticationFailure(
      HttpServletRequest request,
      HttpServletResponse response,
      AuthenticationException exception) 
      throws IOException, ServletException {
 
        response.setStatus(HttpStatus.UNAUTHORIZED.value());
        Map data = new HashMap<>();
        data.put(
          "timestamp", 
          Calendar.getInstance().getTime());
        data.put(
          "exception", 
          exception.getMessage());

        response.getOutputStream()
          .println(objectMapper.writeValueAsString(data));
    }
}

По умолчанию Spring перенаправляет пользователя обратно на страницу входа с параметром запроса , содержащим информацию об ошибке.

В этом приложении мы вернем ответ 401, содержащий информацию об ошибке, а также временную метку ее возникновения.

Помимо компонента по умолчанию, Spring имеет другие готовые к использованию компоненты, которые мы можем использовать в зависимости от того, что мы хотим сделать:

  • Делегирование обработчика сбоя аутентификации делегатов AuthenticationException подклассов различным AuthenticationFailureHandlers , что означает, что мы можем создавать различные модели поведения для разных экземпляров AuthenticationException
  • ExceptionMappingAuthenticationFailureHandler перенаправляет пользователя на определенный URL-адрес в зависимости от полного имени класса AuthenticationException
  • ForwardAuthenticationFailureHandler перенаправит пользователя на указанный URL-адрес независимо от типа исключения AuthenticationException
  • SimpleUrlAuthenticationFailureHandler – это компонент, который используется по умолчанию, он перенаправит пользователя на failureUrl, если указано; в противном случае он просто вернет ответ 401

Теперь , когда мы создали наш пользовательский AuthenticationFailureHandler , давайте настроим наше приложение и переопределим обработчик Spring по умолчанию:

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) 
      throws Exception {
        auth.inMemoryAuthentication()
          .withUser("user1").password(passwordEncoder.encode("user1Pass")).roles("USER");
    }

    @Override
    protected void configure(HttpSecurity http) 
      throws Exception {
        http
          .authorizeRequests()
          .anyRequest()
          .authenticated()
          .and()
          .formLogin()
          .failureHandler(authenticationFailureHandler());
    }

    @Bean
    public AuthenticationFailureHandler authenticationFailureHandler() {
        return new CustomAuthenticationFailureHandler();
    }
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

Обратите внимание на обработчик сбоев() позвони – это там, где мы можем сказать Весна чтобы использовать наш пользовательский компонент вместо использования компонента по умолчанию.

4. Заключение

В этом примере мы настроили обработчик сбоев аутентификации нашего приложения, используя интерфейс Spring AuthenticationFailureHandler .

Реализацию этого примера можно найти в проекте Github .

При локальном запуске вы можете получить доступ к приложению и протестировать его по адресу localhost:8080