1. введение
В этой статье мы покажем, как настроить страницу отказа в доступе в проекте Spring Security .
Это может быть достигнуто либо с помощью конфигурации безопасности Spring, либо с помощью конфигурации веб-приложения в web.xml файл.
В остальных разделах мы более подробно рассмотрим каждый из этих вариантов.
2. Пользовательский JSP
Всякий раз, когда пользователь пытается получить доступ к странице, ограниченной ролями, которых у него нет, приложение возвращает код состояния 403, что означает Доступ запрещен .
Чтобы заменить страницу ответа о состоянии Spring 403 пользовательской, давайте сначала создадим файл JSP с именем AccessDenied.jsp :
3. Конфигурация безопасности Пружины
По умолчанию в Spring Security определен фильтр ExceptionTranslationFilter , который обрабатывает исключения типа AuthenticationException и AccessDeniedException . Последнее выполняется с помощью свойства AccessDeniedHandler, которое использует класс AccessDeniedHandlerImpl .
Чтобы настроить это поведение для использования нашей собственной страницы, созданной выше, нам необходимо переопределить свойства класса ExceptionTranslationFilter|/. Это можно сделать с помощью конфигурации Java или конфигурации XML.
3.1. Доступ К Странице Запрещен
Используя Java, мы можем настроить процесс обработки ошибок 403 с помощью страницы access Denied() или AccessDeniedHandler() методы при настройке элемента HttpSecurity .
Давайте создадим конфигурацию аутентификации, которая ограничивает URL-адреса “/admin/** ” ролью ADMIN и устанавливает страницу отказа в доступе на нашу пользовательскую страницу AccessDenied.jsp :
@Override protected void configure(final HttpSecurity http) throws Exception { http // ... .and() .exceptionHandling().accessDeniedPage("/accessDenied.jsp"); }
Давайте рассмотрим эквивалентную конфигурацию XML для страницы отказано в доступе:
3.2. Обработчик отказа в доступе
Использование обработчика отказа в доступе вместо страницы имеет то преимущество, что мы можем определить пользовательскую логику, которая будет выполняться перед перенаправлением на страницу 403. Для этого нам нужно создать класс, который реализует AccessDeniedHandler интерфейс и переопределяет метод handle () .
Давайте создадим пользовательский класс AccessDeniedHandler , который регистрирует предупреждающее сообщение для каждой попытки отказа в доступе, содержащее пользователя, который сделал эту попытку, и защищенный URL-адрес, к которому они пытались получить доступ:
public class CustomAccessDeniedHandler implements AccessDeniedHandler { public static final Logger LOG = Logger.getLogger(CustomAccessDeniedHandler.class); @Override public void handle( HttpServletRequest request, HttpServletResponse response, AccessDeniedException exc) throws IOException, ServletException { Authentication auth = SecurityContextHolder.getContext().getAuthentication(); if (auth != null) { LOG.warn("User: " + auth.getName() + " attempted to access the protected URL: " + request.getRequestURI()); } response.sendRedirect(request.getContextPath() + "/accessDenied"); } }
В конфигурации безопасности мы определим компонент и установим пользовательский AccessDeniedHandler :
@Bean public AccessDeniedHandler accessDeniedHandler(){ return new CustomAccessDeniedHandler(); } //... .exceptionHandling().accessDeniedHandler(accessDeniedHandler());
Если мы хотим настроить класс CustomAccessDeniedHandler , определенный выше с помощью XML, конфигурация будет выглядеть немного иначе:
4. Конфигурация приложения
Обработка ошибки отказа в доступе может быть выполнена с помощью web.xml файл веб-приложения, определив страницу ошибок тег. Он содержит два подтега, называемых код ошибки, который указывает код состояния, который будет перехвачен, и местоположение, которое обозначает URL-адрес, на который пользователь будет перенаправлен в случае обнаружения кода ошибки:
403 /accessDenied
Если приложение не имеет web.xml file, как и в случае с Spring Boot, аннотации Spring в настоящее время не предоставляют точной альтернативы тегу error-page . Согласно документации Spring, в этом случае рекомендуется использовать методы accessDeniedPage() и AccessDeniedHandler () , представленные в разделе 3.
5. Заключение
В этой краткой статье мы подробно описали различные способы обработки ошибки отказа в доступе с помощью пользовательской страницы 403.
Полный исходный код статьи можно найти в проекте GitHub .