Рубрики
Без рубрики

Spring Security – Настройка страницы 403 Запрещено/Доступ запрещен

Краткое и целенаправленное руководство по настройке страницы ответа на 403 запрещенных ошибок в приложении Spring Security.

Автор оригинала: baeldung.

1. введение

В этой статье мы покажем, как настроить страницу отказа в доступе в проекте Spring Security .

Это может быть достигнуто либо с помощью конфигурации безопасности Spring, либо с помощью конфигурации веб-приложения в web.xml файл.

В остальных разделах мы более подробно рассмотрим каждый из этих вариантов.

2. Пользовательский JSP

Всякий раз, когда пользователь пытается получить доступ к странице, ограниченной ролями, которых у него нет, приложение возвращает код состояния 403, что означает Доступ запрещен .

Чтобы заменить страницу ответа о состоянии Spring 403 пользовательской, давайте сначала создадим файл JSP с именем AccessDenied.jsp :


Sorry, you do not have permission to view this page.

Click ">here to go back to the Homepage.

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 .