Пользовательский фильтр в цепочке фильтров безопасности Spring
1. обзор
В этой быстрой статье мы сосредоточимся на написании настраиваемого фильтра для цепочки фильтров Spring Security.
Дальнейшее чтение:
Spring Security - @PreFilter и @PostFilter
Узнайте, как использовать аннотации @PreFilter и @PostFilter Spring Security, на практических примерах.
Введение в Java Config для Spring Security
Краткое и практическое руководство по Java Config для Spring Security
Автоматическая настройка безопасности Spring Boot
Краткое и практическое руководство по настройке Spring Security по умолчанию в Spring Boot.
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.