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

Rechercher 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,we’ll discuss different ways to find the registered Spring Security Filters.

2. Débogage de sécurité

Premièrement, nous allons activer 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é en utilisant la propriétédebug:

@EnableWebSecurity(debug = true)

Ainsi, lorsque nous enverrons une demande au serveur, toutes les informations de la demande seront enregistrées.

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

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

3. Enregistrement

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

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

Nous utiliseronsFilterChainProxy pour obtenir les filtres de sécurité.

Commençons par le câblage automatique du beanspringSecurityFilterChain:

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

Ici, nous avons utilisé un@Qualifier avec le nomspringSecurityFilterChain avec le typeFilter au lieu deFilterChainProxy.  C'est parce que la méthode despringSecurityFilterChain() dansWebSecurityConfiguration, qui crée la chaîne de filtres Spring Security, type de retourFilter et nonFilterChainProxy.

Ensuite, nous allons convertir cet objet enFilterChainProxy et appeler la méthodegetFilterChains():

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 is configured using a list of SecurityFilterChain. Cependant, la plupart des applications n'ont besoin que d'unSecurityFilterChain.

5. Filtres de sécurité Spring importants

Enfin, examinons 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éclenche des exceptions lorsque l'accès est refusé

  • ExceptionTranslationFilter: intercepter les exceptions Spring Security

6. Conclusion

Dans ces articles rapides, nous avons expliqué comment rechercher les filtres Spring Security enregistrés par programme et à l'aide de journaux.

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