Перейти к основному содержимому

Обработка исключений безопасности Spring

· 3 мин. чтения

1. Обзор

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

2. Весенняя безопасность

Spring Security — это библиотека, которая является частью проекта Spring. Он пытается сгруппировать все функции управления доступом пользователей в проектах Spring . Контроль доступа позволяет ограничить параметры, которые могут выполняться заданным набором пользователей или ролей в приложении. В этом направлении Spring Security контролирует вызовы бизнес-логики или ограничивает доступ HTTP-запросов к определенным URL-адресам . Имея это в виду, мы должны настроить приложение, сообщив Spring Security, как должен вести себя уровень безопасности.

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

  • Обработчик успешной аутентификации
  • Обработчик ошибок аутентификации
  • Обработчик отказа в доступе

Во-первых, давайте подробнее рассмотрим конфигурацию.

3. Конфигурация безопасности

Прежде всего, у нас есть класс конфигурации, который должен расширять класс WebSecurityConfigurerAdapter . Он будет отвечать за управление всеми настройками безопасности приложения. Итак, здесь мы должны представить наши обработчики.

С одной стороны определим необходимую конфигурацию:

@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf()
.disable()
.httpBasic().disable()
.authorizeRequests()
.antMatchers("/login").permitAll()
.antMatchers("/customError").permitAll()
.antMatchers("/access-denied").permitAll()
.antMatchers("/secured").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.formLogin()
.failureHandler(authenticationFailureHandler())
.successHandler(authenticationSuccessHandler())
.and()
.exceptionHandling()
.accessDeniedHandler(accessDeniedHandler())
.and()
.logout();
}
}

Интересно отметить, что URL-адреса перенаправления, такие как «/login» , «/customError» и «/access-denied» , не должны иметь каких-либо ограничений для доступа к ним. Итак, мы аннотируем их как allowAll() .

С другой стороны, мы должны определить Beans, которые определяют типы исключений, которые мы можем обрабатывать:

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

@Bean
public AuthenticationSuccessHandler authenticationSuccessHandler() {
return new CustomAuthenticationSuccessHandler();
}

@Bean
public AccessDeniedHandler accessDeniedHandler() {
return new CustomAccessDeniedHandler();
}

Поскольку AuthenticationSuccessHandler обрабатывает счастливый путь, мы определим два оставшихся bean-компонента для случаев исключения. Эти два обработчика мы теперь должны адаптировать и реализовать для наших нужд . Итак, приступим к реализации каждого из них.

4. Обработчик ошибок аутентификации

С одной стороны, у нас есть интерфейс AuthenticationFailureHandler . Он отвечает за управление исключениями, возникающими, когда пользователь не может войти в систему . Этот интерфейс предоставляет нам метод onAuthenticationFailure() для настройки логики обработчика. Он будет вызываться Spring Security при неудачной попытке входа в систему . Имея это в виду, давайте определим наш обработчик исключений, чтобы перенаправлять нас на страницу ошибки при неудачном входе в систему:

public class CustomAuthenticationFailureHandler implements AuthenticationFailureHandler {

@Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception)
throws IOException {
response.sendRedirect("/customError");
}
}

5. Обработчик отказа в доступе

С другой стороны, когда неавторизованный пользователь пытается получить доступ к защищенной или защищенной странице, Spring Security выдает исключение отказа в доступе . В Spring Security доступна страница отказа в доступе по умолчанию 403, которую мы можем настроить. Это управляется интерфейсом AccessDeniedHandler . Кроме того, он предоставляет метод handle() для настройки логики перед перенаправлением пользователя на страницу 403 :

public class CustomAccessDeniedHandler implements AccessDeniedHandler {

@Override
public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException exc) throws IOException {
response.sendRedirect("/access-denied");
}
}

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

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

Полный исходный код статьи доступен на GitHub.