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

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

1. обзор

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

В этом руководствеwe’ll discuss different ways to find the registered 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 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.1FilterChainProxy is configured using a list of SecurityFilterChain. Однако большинству приложений требуется только одинSecurityFilterChain.

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

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

  • UsernamePasswordAuthenticationFilter: процесс аутентификации, по умолчанию отвечает на URL «/ login»

  • AnonymousAuthenticationFilter: когда в SecurityContextHolder нет объекта аутентификации, он создает объект анонимной аутентификации и помещает его туда

  • FilterSecurityInterceptor: вызывает исключения при отказе в доступе

  • ExceptionTranslationFilter: поймать исключения Spring Security

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

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

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