Trova i filtri di sicurezza Spring registrati

1. Panoramica

Spring Security si basa su una catena di filtri servlet. Ogni filtro ha una responsabilità specifica e, a seconda della configurazione, i filtri vengono aggiunti o rimossi.

In questo tutorial, discuteremo diversi modi per trovare i filtri Spring Security registrati .

2. Debug di sicurezza

Innanzitutto, abiliteremo il debug di sicurezza che registrerà informazioni di sicurezza dettagliate su ogni richiesta.

Possiamo abilitare il debug di sicurezza utilizzando la proprietà debug :

@EnableWebSecurity(debug = true)

In questo modo, quando inviamo una richiesta al server, tutte le informazioni della richiesta verranno registrate.

Saremo anche in grado di vedere l'intera catena di filtri di sicurezza:

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

3. Registrazione

Successivamente, troveremo i nostri filtri di sicurezza abilitando la registrazione per FilterChainProxy .

Possiamo abilitare la registrazione aggiungendo la seguente riga a application.properties :

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

Ecco il registro correlato:

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. Ottenere i filtri a livello di programmazione

Vedremo ora come ottenere i filtri di sicurezza registrati a livello di programmazione.

Useremo FilterChainProxy per ottenere i filtri di sicurezza.

Innanzitutto, cabliamo automaticamente il bean springSecurityFilterChain :

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

Qui, abbiamo usato un @Qualifier con il nome springSecurityFilterChain con il tipo Filter invece di FilterChainProxy. Questo perché il metodo di springSecurityFilterChain () in WebSecurityConfiguration, che crea la catena di filtri Spring Security, restituisce il tipo Filter e non FilterChainProxy.

Successivamente, eseguiremo il cast di questo oggetto su FilterChainProxy e chiameremo il metodo 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())); }

Ed ecco un output di esempio:

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 ...

Notare che a partire da Spring Security 3.1, FilterChainProxy è configurato utilizzando un elenco di SecurityFilterChain. Tuttavia, la maggior parte delle applicazioni richiede un solo SecurityFilterChain.

5. Importanti filtri Spring Security

Infine, diamo un'occhiata ad alcuni importanti filtri di sicurezza:

  • UsernamePasswordAuthenticationFilter : processo di autenticazione, risponde per impostazione predefinita all'URL "/ login"
  • AnonymousAuthenticationFilter : quando non c'è un oggetto di autenticazione in SecurityContextHolder, crea un oggetto di autenticazione anonimo e lo inserisce
  • FilterSecurityInterceptor: solleva eccezioni quando l'accesso viene negato
  • ExceptionTranslationFilter : cattura le eccezioni di Spring Security

6. Conclusione

In questo breve articolo, abbiamo esplorato come trovare i filtri Spring Security registrati a livello di programmazione e utilizzando i log.

Come sempre, il codice sorgente può essere trovato su GitHub.