Перейти к основному содержимому

Найдите зарегистрированные фильтры безопасности Spring

· 3 мин. чтения

Задача: Сумма двух чисел

Напишите функцию twoSum. Которая получает массив целых чисел nums и целую сумму target, а возвращает индексы двух чисел, сумма которых равна target. Любой набор входных данных имеет ровно одно решение, и вы не можете использовать один и тот же элемент дважды. Ответ можно возвращать в любом порядке...

ANDROMEDA

1. Обзор

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

В этом руководстве мы обсудим различные способы поиска зарегистрированных Spring Security Filters .

2. Отладка безопасности

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

Мы можем включить отладку безопасности, используя свойство debug :

@EnableWebSecurity(debug = true)

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

Мы также сможем увидеть всю цепочку фильтров безопасности:

Security filter chain: [
WebAsyncManagerIntegrationFilter
SecurityContextPersistenceFilter
HeaderWriterFilter
LogoutFilter
UsernamePasswordAuthenticationFilter
// ...
]

3. Ведение журнала

Далее мы найдем наши фильтры безопасности, включив ведение журнала для FilterChainProxy .

Мы можем включить ведение журнала, добавив следующую строку в application.properties :

logging.level.org.springframework.security.web.FilterChainProxy=DEBUG

Вот соответствующий журнал:

DEBUG o.s.security.web.FilterChainProxy - /foos/1 at position 1 of 12 in additional filter chain; firing Filter: 'WebAsyncManagerIntegrationFilter'
DEBUG o.s.security.web.FilterChainProxy - /foos/1 at position 2 of 12 in additional filter chain; firing Filter: 'SecurityContextPersistenceFilter'
DEBUG o.s.security.web.FilterChainProxy - /foos/1 at position 3 of 12 in additional filter chain; firing Filter: 'HeaderWriterFilter'
DEBUG o.s.security.web.FilterChainProxy - /foos/1 at position 4 of 12 in additional filter chain; firing Filter: 'LogoutFilter'
DEBUG o.s.security.web.FilterChainProxy - /foos/1 at position 5 of 12 in additional filter chain; firing Filter: 'UsernamePasswordAuthenticationFilter'
...

4. Программное получение фильтров

Теперь мы увидим, как программно получить зарегистрированные фильтры безопасности.

Мы будем использовать FilterChainProxy для получения фильтров безопасности.

Во-первых, давайте автоматически подключим bean-компонент springSecurityFilterChain :

@Autowired
@Qualifier("springSecurityFilterChain")
private Filter springSecurityFilterChain;

Здесь мы использовали @Qualifier с именем springSecurityFilterChain с типом Filter вместо FilterChainProxy. Это связано с тем, что метод springSecurityFilterChain() в WebSecurityConfiguration , который создает цепочку фильтров Spring Security, возвращает тип Filter , а не FilterChainProxy.

Затем мы приведем этот объект к FilterChainProxy и вызовем метод getFilterChains() :

public void getFilters() {
FilterChainProxy filterChainProxy = (FilterChainProxy) springSecurityFilterChain;
List<SecurityFilterChain> list = filterChainProxy.getFilterChains();
list.stream()
.flatMap(chain -> chain.getFilters().stream())
.forEach(filter -> System.out.println(filter.getClass()));
}

И вот пример вывода:

class org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter
class org.springframework.security.web.context.SecurityContextPersistenceFilter
class org.springframework.security.web.header.HeaderWriterFilter
class org.springframework.security.web.authentication.logout.LogoutFilter
class org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter
...

Обратите внимание, что, начиная с Spring Security 3.1, FilterChainProxy настраивается с использованием списка SecurityFilterChain. Однако большинству приложений требуется только один SecurityFilterChain.

5. Важные фильтры безопасности Spring

Наконец, давайте взглянем на некоторые важные фильтры безопасности:

  • UsernamePasswordAuthenticationFilter : процесс аутентификации, по умолчанию отвечает на URL «/login»
  • AnonymousAuthenticationFilter : когда в SecurityContextHolder нет объекта аутентификации, он создает анонимный объект аутентификации и помещает его туда.
  • FilterSecurityInterceptor: вызывать исключения при отказе в доступе
  • ExceptionTranslationFilter : ловить исключения безопасности Spring

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

В этих кратких статьях мы рассмотрели, как найти зарегистрированные фильтры Spring Security программно и с помощью журналов.

Как всегда, исходный код можно найти на GitHub .