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.