Автор оригинала: 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()); Mapdata = 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