1. Übersicht
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 werden verschiedene Möglichkeiten zum Auffinden der registrierten Spring-Sicherheitsfilter erläutert .
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 Debug- Eigenschaft aktivieren :
@EnableWebSecurity(debug = true)
Auf diese Weise werden beim Senden einer Anfrage an den Server alle Anforderungsinformationen protokolliert.
Wir können auch die gesamte Sicherheitsfilterkette sehen:
Security filter chain: [ WebAsyncManagerIntegrationFilter SecurityContextPersistenceFilter HeaderWriterFilter LogoutFilter UsernamePasswordAuthenticationFilter // ... ]
3. Protokollierung
Als Nächstes finden wir unsere Sicherheitsfilter, indem wir die Protokollierung für FilterChainProxy aktivieren .
Sie können die Protokollierung aktivieren, indem Sie application.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
Nun werden wir sehen, wie die registrierten Sicherheitsfilter programmgesteuert abgerufen werden.
Wir werden FilterChainProxy verwenden , um die Sicherheitsfilter zu erhalten.
Lassen Sie uns zunächst die springSecurityFilterChain- Bean automatisch verdrahten :
@Autowired @Qualifier("springSecurityFilterChain") private Filter springSecurityFilterChain;
Hier haben wir einen @Qualifier mit dem Namen springSecurityFilterChain vom Typ Filter anstelle von FilterChainProxy verwendet. Dies liegt daran, dass die Methode springSecurityFilterChain () in WebSecurityConfiguration die Spring Security-Filterkette, den Rückgabetyp Filter und nicht FilterChainProxy erstellt.
Als Nächstes wandeln wir dieses Objekt in FilterChainProxy um und rufen die Methode getFilterChains () 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 FilterChainProxy seit Spring Security 3.1 mithilfe einer Liste von SecurityFilterChain konfiguriert wird . Die meisten Anwendungen benötigen jedoch nur eine SecurityFilterChain.
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: Ausnahmen auslösen , wenn der Zugriff verweigert wird
- ExceptionTranslationFilter : Spring Security-Ausnahmen abfangen
6. Fazit
In diesen kurzen Artikeln haben wir untersucht, wie Sie die registrierten Spring Security-Filter programmgesteuert und mithilfe von Protokollen finden.
Wie immer ist der Quellcode auf GitHub zu finden.