1. Обзор
Безопасность Spring основана на цепочке фильтров сервлетов. Каждый фильтр несет определенную ответственность, и в зависимости от конфигурации фильтры добавляются или удаляются.
В этом уроке мы обсудим различные способы поиска зарегистрированных фильтров безопасности Spring .
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 чтобы получить фильтры безопасности.
Во-первых, давайте автоматически подключим springSecurityFilterChain bean:
@Autowired @Qualifier("springSecurityFilterChain") private Filter springSecurityFilterChain;
Здесь мы использовали @квалификатор с именем springSecurityFilterChain с типом Filter вместо FilterChainProxy. Это связано с тем, что метод springSecurityFilterChain() в WebSecurityConfiguration , который создает цепочку фильтров безопасности Spring, возвращает тип Filter , а не FilterChainProxy.
Затем мы приведем этот объект к FilterChainProxy и вызовем метод getFilterChains() :
public void getFilters() { FilterChainProxy filterChainProxy = (FilterChainProxy) springSecurityFilterChain; Listlist = 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. Однако большинству приложений требуется только одна цепочка фильтров безопасности|/.
5. Важные Фильтры Безопасности Пружины
Наконец, давайте рассмотрим некоторые из важных фильтров безопасности:
- UsernamePasswordAuthenticationFilter : проверка подлинности процесса, по умолчанию отвечает на URL-адрес “/login”
- AnonymousAuthenticationFilter : когда в SecurityContextHolder нет объекта аутентификации, он создает объект анонимной аутентификации и помещает его туда
- FilterSecurityInterceptor: вызывать исключения при отказе в доступе
- ExceptionTranslationFilter : перехватывать исключения безопасности Spring
6. Заключение
В этой краткой статье мы рассмотрели, как найти зарегистрированные фильтры безопасности Spring программно и с помощью журналов.
Как всегда, исходный код можно найти на GitHub .