Автор оригинала: 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