Finden Sie die registrierten Spring-Sicherheitsfilter

Finden Sie die registrierten Spring-Sicherheitsfilter

1. Überblick

Spring Security basiert auf einer Kette von Servlet-Filtern. Jeder Filter hat eine bestimmte Verantwortung und je nach Konfiguration werden Filter hinzugefügt oder entfernt.

In diesem Tutorial werdenwe’ll discuss different ways to find the registered Spring Security Filters.

2. Sicherheits-Debugging

Zunächst aktivieren wir das Sicherheits-Debugging, bei dem detaillierte Sicherheitsinformationen zu jeder Anforderung protokolliert werden.

Wir können das Sicherheits-Debugging mithilfe der Eigenschaftdebugaktivieren:

@EnableWebSecurity(debug = true)

Auf diese Weise werden beim Senden einer Anforderung an den Server alle Anforderungsinformationen protokolliert.

Wir können auch die gesamte Sicherheitsfilterkette anzeigen:

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

3. Protokollierung

Als Nächstes finden wir unsere Sicherheitsfilter, indem wir die Protokollierung fürFilterChainProxy aktivieren.

Wir können die Protokollierung aktivieren, indem wirapplication.properties die folgende Zeile hinzufügen:

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

Hier ist das zugehörige Protokoll:

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. Programmgesteuertes Abrufen der Filter

Jetzt werden wir sehen, wie Sie die registrierten Sicherheitsfilter programmgesteuert erhalten.

Wir verwendenFilterChainProxy, um die Sicherheitsfilter abzurufen.

Lassen Sie uns zunächst diespringSecurityFilterChain-Bohne automatisch verdrahten:

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

Hier haben wir@Qualifier mit dem NamenspringSecurityFilterChain mit dem TypFilter anstelle vonFilterChainProxy.  verwendet. Dies liegt daran, dass die Methode vonspringSecurityFilterChain() inWebSecurityConfiguration, erstellt wird Die Spring Security-Filterkette gibt den TypFilter und nichtFilterChainProxy. zurück

Als Nächstes wandeln wir dieses Objekt inFilterChainProxy um und rufen die MethodegetFilterChains() auf:

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()));
}

Und hier ist eine Beispielausgabe:

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

Beachten Sie, dass seit Spring Security 3.1FilterChainProxy is configured using a list of SecurityFilterChain.. Die meisten Anwendungen benötigen jedoch nur einSecurityFilterChain.

5. Wichtige Federsicherheitsfilter

Schauen wir uns zum Schluss einige wichtige Sicherheitsfilter an:

  • UsernamePasswordAuthenticationFilter: Prozessauthentifizierung, antwortet standardmäßig auf die URL "/ login"

  • AnonymousAuthenticationFilter: Wenn in SecurityContextHolder kein Authentifizierungsobjekt vorhanden ist, wird ein anonymes Authentifizierungsobjekt erstellt und dort abgelegt

  • FilterSecurityInterceptor: lösen Ausnahmen aus, wenn der Zugriff verweigert wird

  • ExceptionTranslationFilter: Spring Security-Ausnahmen abfangen

6. Fazit

In diesen kurzen Artikeln haben wir untersucht, wie die registrierten Spring Security-Filter programmgesteuert und mithilfe von Protokollen gefunden werden.

Wie immer kann der Quellcodeover on GitHub gefunden werden.