«1. Обзор
Spring Security основан на цепочке фильтров сервлетов. Каждый фильтр несет определенную ответственность, и в зависимости от конфигурации фильтры добавляются или удаляются.
В этом руководстве мы обсудим различные способы поиска зарегистрированных фильтров безопасности Spring.
2. Отладка безопасности
Сначала мы включим отладку безопасности, которая будет регистрировать подробную информацию о безопасности по каждому запросу.
Мы можем включить отладку безопасности, используя свойство отладки:
@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()));
}
А вот пример вывода: список SecurityFilterChain. Однако большинству приложений требуется только один SecurityFilterChain.
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
...
5. Важные фильтры безопасности Spring
Наконец, давайте рассмотрим некоторые важные фильтры безопасности:
UsernamePasswordAuthenticationFilter: процесс аутентификации, по умолчанию отвечает на URL-адрес «/login». объект аутентификации в SecurityContextHolder, он создает анонимный объект аутентификации и помещает его туда FilterSecurityInterceptor: создавать исключения, когда доступ запрещен ExceptionTranslationFilter: перехватывать исключения безопасности Spring Spring Security фильтрует программно и с использованием журналов.
-
Как всегда, исходный код можно найти на GitHub.
«
In this quick articles, we explored how to find the registered Spring Security filters programmatically and using logs.
As always, source code can be found over on GitHub.