Пользовательский фильтр в цепочке фильтров безопасности Spring

Пользовательский фильтр в цепочке фильтров безопасности Spring

1. обзор

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

Дальнейшее чтение:

Spring Security - @PreFilter и @PostFilter

Узнайте, как использовать аннотации @PreFilter и @PostFilter Spring Security, на практических примерах.

Read more

Введение в Java Config для Spring Security

Краткое и практическое руководство по Java Config для Spring Security

Read more

Автоматическая настройка безопасности Spring Boot

Краткое и практическое руководство по настройке Spring Security по умолчанию в Spring Boot.

Read more

2. Создание фильтра

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

Но, конечно, иногда необходимо реализовать новые функции с помощью создания нового фильтра для использования в цепочке.

Начнем с реализацииorg.springframework.web.filter.GenericFilterBean.

GenericFilterBean - это простая реализацияjavax.servlet.Filter, поддерживающая Spring.

Что касается реализации - нам нужно реализовать только один метод:

public class CustomFilter extends GenericFilterBean {

    @Override
    public void doFilter(
      ServletRequest request,
      ServletResponse response,
      FilterChain chain) throws IOException, ServletException {
        chain.doFilter(request, response);
    }
}

3. Использование фильтра в конфигурации безопасности

Мы можем выбрать конфигурацию XML или конфигурацию Java, чтобы подключить фильтр к конфигурации Spring Security.

3.1. Конфигурация Java

Вы можете зарегистрировать фильтр, программно переопределив методconfigure изWebSecurityConfigurerAdapter. Например, он работает с методомaddFilterAfter на экземпляреHttpSecurity:

@Configuration
public class CustomWebSecurityConfigurerAdapter
  extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.addFilterAfter(
          new CustomFilter(), BasicAuthenticationFilter.class);
    }
}

Есть несколько возможных методов:

  • addFilterBefore(filter, class) добавляетfilter перед положением указанного фильтраclass

  • addFilterAfter(filter, class) - добавляетfilter после позиции указанного фильтраclass

  • addFilterAt(filter, class) - добавляетfilter в место указанного фильтраclass

  • addFilter(filter) - добавляетfilter, который должен быть экземпляром или расширять один из фильтров, предоставляемых Spring Security

3.2. Конфигурация XML

Вы можете добавить фильтр в цепочку, используя тегcustom-filter и один изthese names, чтобы указать положение вашего фильтра. Например, на это указывает атрибутafter:


    


Вот все атрибуты, чтобы точно указать место вашего фильтра в стеке:

  • after - описывает фильтр, сразу после которого пользовательский фильтр будет помещен в цепочку

  • before - определяет фильтр, перед которым наш фильтр должен быть помещен в цепочку

  • position - позволяет заменить стандартный фильтр в явной позиции на собственный фильтр

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

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

Как всегда, все примеры кода доступны вsample Github project.