Trouvez les filtres de sécurité Spring enregistrés

1. Vue d'ensemble

Spring Security est basé sur une chaîne de filtres de servlet. Chaque filtre a une responsabilité spécifique et en fonction de la configuration, des filtres sont ajoutés ou supprimés.

Dans ce didacticiel, nous discuterons de différentes façons de trouver les filtres de sécurité Spring enregistrés .

2. Débogage de sécurité

Tout d'abord, nous activerons le débogage de sécurité qui enregistrera des informations de sécurité détaillées sur chaque demande.

Nous pouvons activer le débogage de sécurité à l'aide de la propriété debug :

@EnableWebSecurity(debug = true)

De cette façon, lorsque nous envoyons une demande au serveur, toutes les informations de la demande seront enregistrées.

Nous pourrons également voir toute la chaîne des filtres de sécurité:

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

3. Journalisation

Ensuite, nous trouverons nos filtres de sécurité en activant la journalisation pour FilterChainProxy .

Nous pouvons activer la journalisation en ajoutant la ligne suivante à application.properties :

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

Voici le journal associé:

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. Obtention des filtres par programme

Nous allons maintenant voir comment obtenir les filtres de sécurité enregistrés par programme.

Nous utiliserons FilterChainProxy pour obtenir les filtres de sécurité.

Commençons par le câblage automatique du bean springSecurityFilterChain :

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

Ici, nous avons utilisé un @Qualifier avec le nom springSecurityFilterChain avec le type Filter au lieu de FilterChainProxy. En effet, la méthode de springSecurityFilterChain () dans WebSecurityConfiguration, qui crée la chaîne de filtres Spring Security, renvoie le type Filter et non FilterChainProxy.

Ensuite, nous allons convertir cet objet en FilterChainProxy et appeler la méthode 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())); }

Et voici un exemple de sortie:

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

Notez que depuis Spring Security 3.1, FilterChainProxy est configuré à l'aide d'une liste de SecurityFilterChain. Cependant, la plupart des applications n'ont besoin que d'un seul SecurityFilterChain.

5. Filtres de sécurité Spring importants

Enfin, jetons un coup d'œil à certains des filtres de sécurité importants:

  • UsernamePasswordAuthenticationFilter : processus d'authentification, répond par défaut à l'URL «/ login»
  • AnonymousAuthenticationFilter : lorsqu'il n'y a pas d'objet d'authentification dans SecurityContextHolder, il crée un objet d'authentification anonyme et le place là
  • FilterSecurityInterceptor: déclencher des exceptions lorsque l'accès est refusé
  • ExceptionTranslationFilter : intercepter les exceptions Spring Security

6. Conclusion

Dans cet article rapide, nous avons exploré comment trouver les filtres Spring Security enregistrés par programmation et à l'aide de journaux.

Comme toujours, le code source peut être trouvé sur GitHub.