Encontre os filtros de segurança de primavera registrados
1. Visão geral
O Spring Security é baseado em uma cadeia de filtros de servlet. Cada filtro tem uma responsabilidade específica e, dependendo da configuração, os filtros são adicionados ou removidos.
Neste tutorial,we’ll discuss different ways to find the registered Spring Security Filters.
2. Depuração de Segurança
Primeiro, vamos ativar a depuração de segurança, que registrará informações de segurança detalhadas em cada solicitação.
Podemos habilitar a depuração de segurança usando a propriedadedebug:
@EnableWebSecurity(debug = true)
Dessa forma, quando enviarmos uma solicitação ao servidor, todas as informações da solicitação serão registradas.
Também poderemos ver toda a cadeia de filtros de segurança:
Security filter chain: [
WebAsyncManagerIntegrationFilter
SecurityContextPersistenceFilter
HeaderWriterFilter
LogoutFilter
UsernamePasswordAuthenticationFilter
// ...
]
3. Exploração madeireira
A seguir, encontraremos nossos filtros de segurança habilitando o registro paraFilterChainProxy.
Podemos ativar o registro adicionando a seguinte linha aapplication.properties:
logging.level.org.springframework.security.web.FilterChainProxy=DEBUG
Aqui está o registro relacionado:
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. Obtendo os filtros programaticamente
Agora, veremos como obter os filtros de segurança registrados de maneira programática.
UsaremosFilterChainProxy para obter os filtros de segurança.
Primeiro, vamos autowire o beanspringSecurityFilterChain:
@Autowired
@Qualifier("springSecurityFilterChain")
private Filter springSecurityFilterChain;
Aqui, usamos um@Qualifier com o nomespringSecurityFilterChain com o tipoFilter em vez deFilterChainProxy. Isso ocorre porque o método despringSecurityFilterChain() emWebSecurityConfiguration, que cria a cadeia de filtros Spring Security, tipo de retornoFilter e nãoFilterChainProxy.
A seguir, vamos lançar este objeto paraFilterChainProxye chamar o métodogetFilterChains():
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()));
}
E aqui está um exemplo de saída:
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
...
Observe que, desde Spring Security 3.1,FilterChainProxy is configured using a list of SecurityFilterChain. No entanto, a maioria dos aplicativos precisa de apenas umSecurityFilterChain.
5. Filtros importantes de segurança da mola
Por fim, vamos dar uma olhada em alguns dos filtros de segurança importantes:
-
UsernamePasswordAuthenticationFilter: autenticação do processo, responde por padrão ao URL “/ login”
-
AnonymousAuthenticationFilter: quando não há nenhum objeto de autenticação em SecurityContextHolder, ele cria um objeto de autenticação anônimo e o coloca lá
-
FilterSecurityInterceptor: gera exceções quando o acesso é negado
-
ExceptionTranslationFilter: captura exceções do Spring Security
6. Conclusão
Neste rápido artigo, exploramos como encontrar os filtros registrados do Spring Security programaticamente e usando logs.
Como sempre, o código-fonte pode ser encontradoover on GitHub.