Funktionsweise der Spring Security-Filterkette
In diesem Beitrag werde ich diskutieren, wie die Spring Security Filter-Kette funktioniert. Spring Security verwendet eine Kette von Filtern, um Sicherheitsfunktionen auszuführen. Wenn Sie Ihre eigene Logik für eine Sicherheitsfunktion anpassen oder hinzufügen möchten, können Sie Ihren eigenen Filter schreiben und diesen während der Kettenausführung aufrufen.
Einführung
Wenn Sie Spring Security in einer Webanwendung verwenden, durchläuft die Anfrage des Clients eine Kette von Sicherheitsfiltern. Sicherheitsfilter adaptieren dieses Konzept von Web Servlets. Grundsätzlich haben Sie einen Controller, um Benutzeranfragen zu erhalten. Sicherheitsfilter fangen die eingehende Anfrage ab und führen eine Validierung zur Authentifizierung oder Autorisierung durch, bevor sie die Anfrage an den Zielcontroller umleiten.
Kurz gesagt, der Fluss geht wie
- Der Benutzer greift auf die Anwendung zu, die durch Spring Security gesichert ist. Normalerweise geschieht dies über einen Webbrowser und die Anwendung sendet die Anfrage an einen Webserver.
- Der Webserver analysiert die eingehende Anfrage
HttpServletRequest
und leitet es durch Spring Security-Filter. Jeder Filter führt seine Logik aus, um sicherzustellen, dass die eingehende Anfrage sicher ist. - Wenn alles gut geht, geht die Anfrage schließlich an MVC Controller, der das Back-End für die Anwendung hostet. Filter können
HttpServletResponse
erstellen und zum Client zurückkehren, ohne auch nur den Controller zu erreichen.
Was ist Spring Security Filter Chain?
Lassen Sie uns eine einfache Webanwendung mit Spring Boot und Spring Security erstellen.
Fügen Sie diese beiden Abhängigkeiten in Ihrem build.gradle
hinzu Datei, um loszulegen
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-web'
Verantwortlicher
Ich werde diese App einfach halten, also fügen wir unserer Web-App einen REST-Controller hinzu.
package com.betterjavacode.securityfilterdemo.controllers;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MainController
{
@GetMapping("/home")
public String home() {
return "Welcome, home!!!!";
}
}
Folglich führen wir unsere Anwendung jetzt aus.
Führen Sie die Anwendung aus
Sobald wir die App ausführen, sehen wir das Protokoll, das Spring Boot standardmäßig druckt. Dieses Protokoll sieht wie folgt aus:
2022-08-13 10:24:13.120 INFO 9368 --- [ main] c.b.s.SecurityfilterdemoApplication : Starting SecurityfilterdemoApplication using Java 1.8.0_212 on YMALI2019 with PID 9368 (C:\projects\securityfilterdemo\build\libs\securityfilterdemo-0.0.1-SNAPSHOT.jar started by Yogesh Mali in C:\projects\securityfilterdemo\build\libs)
2022-08-13 10:24:13.123 INFO 9368 --- [ main] c.b.s.SecurityfilterdemoApplication : No active profile set, falling back to 1 default profile: "default"
2022-08-13 10:24:14.543 INFO 9368 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2022-08-13 10:24:14.553 INFO 9368 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2022-08-13 10:24:14.553 INFO 9368 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.65]
2022-08-13 10:24:14.619 INFO 9368 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2022-08-13 10:24:14.619 INFO 9368 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1433 ms
2022-08-13 10:24:14.970 WARN 9368 --- [ main] .s.s.UserDetailsServiceAutoConfiguration :
Using generated security password: 22bd9a92-2130-487c-bf59-71e61c8124ee
This generated password is for development use only. Your security configuration must be updated before running your application in production.
2022-08-13 10:24:15.069 INFO 9368 --- [ main] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.session.DisableEncodeUrlFilter@22555ebf, org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@36ebc363, org.springframework.security.web.context.SecurityContextPersistenceFilter@34123d65, org.springframework.security.web.header.HeaderWriterFilter@73a1e9a9, org.springframework.security.web.csrf.CsrfFilter@1aafa419, org.springframework.security.web.authentication.logout.LogoutFilter@515c6049, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@408d971b, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@41d477ed, org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@45752059, org.springframework.security.web.authentication.www.BasicAuthenticationFilter@c730b35, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@65fb9ffc, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@1bb5a082, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@34e9fd99, org.springframework.security.web.session.SessionManagementFilter@7b98f307, org.springframework.security.web.access.ExceptionTranslationFilter@14cd1699, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@1d296da]
2022-08-13 10:24:15.127 INFO 9368 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2022-08-13 10:24:15.138 INFO 9368 --- [ main] c.b.s.SecurityfilterdemoApplication : Started SecurityfilterdemoApplication in 2.477 seconds (JVM running for 2.856)
Wir können das von der Federsicherheit generierte Passwort sehen. Aber es gibt auch eine Logmeldung
Will secure any request with [org.springframework.security.web.session.DisableEncodeUrlFilter@22555ebf,
org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@36ebc363,
org.springframework.security.web.context.SecurityContextPersistenceFilter@34123d65,
org.springframework.security.web.header.HeaderWriterFilter@73a1e9a9,
org.springframework.security.web.csrf.CsrfFilter@1aafa419,
org.springframework.security.web.authentication.logout.LogoutFilter@515c6049,
org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@408d971b,
org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@41d477ed,
org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@45752059,
org.springframework.security.web.authentication.www.BasicAuthenticationFilter@c730b35,
org.springframework.security.web.savedrequest.RequestCacheAwareFilter@65fb9ffc,
org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@1bb5a082,
org.springframework.security.web.authentication.AnonymousAuthenticationFilter@34e9fd99,
org.springframework.security.web.session.SessionManagementFilter@7b98f307,
org.springframework.security.web.access.ExceptionTranslationFilter@14cd1699,
org.springframework.security.web.access.intercept.FilterSecurityInterceptor@1d296da]
Die obige Liste zeigt die Anzahl der Filter in der Kette der Sicherheitsfilter. Spring Security konfiguriert diese Filter automatisch bei jeder eingehenden Anfrage. Filter werden in dieser bestimmten Reihenfolge ausgeführt. Man kann die Reihenfolge durch die Konfiguration von Modulen ändern.
Sicherheitsfilter
Jetzt haben wir die Grundlagen von Spring Security Filters behandelt. Sehen wir uns an, wie diese Filter mit Servlet-Filtern und dem Anwendungskontext von Spring gestapelt werden.
DelegatingFilterProxy
ist der Filter, der als Brücke zwischen dem Lebenszyklus des Servlet-Containers und dem Anwendungskontext von Spring fungiert. Sobald die erste Anfrage an DelegatingFilterProxy
kommt filter, delegiert es die Anfrage an Spring Bean, um den Sicherheitsfilterfluss zu starten.
FilterChainProxy
ist der Filter, der Informationen zu allen Sicherheitsfiltern enthält. Es gleicht die eingehende Anfrage mit der URI-Zuordnung ab und leitet die Anfrage entsprechend an diesen Filter weiter. DelegatingFilterProxy
Starten Sie den Sicherheitsfluss, indem Sie FilterChainProxy
aufrufen .
FilterChainProxy
bestimmt, welche SecurityFilterChain aus der eingehenden Anfrage aufgerufen werden soll. Man kann RequestMatcher
implementieren Benutzeroberfläche zum Erstellen von Regeln für Ihre Sicherheitsfilterkette.
Wie oben gezeigt, enthält Spring Security verschiedene Sicherheitsfilter, aber es gibt bestimmte Filter, die kritisch sind, wenn die eingehende Anfrage sie passiert.
UsernamePasswordAuthenticationFilter
– Wenn Ihre Anwendung für Benutzername und Passwort konfiguriert ist, durchläuft die Anfrage diesen Filter, um die Benutzername/Passwort-Authentifizierung zu verarbeiten.
SecurityContextPersistenceFilter
– Sobald der Benutzer authentifiziert ist, werden die Benutzerinformationen in einem Sicherheitskontext konfiguriert. Dieser Filter füllt SecurityContextHolder
.
Schlussfolgerung
In diesem Beitrag habe ich die Details der Spring Security Filter Chain gezeigt und wie sie funktioniert. Sobald Sie diese Grundlagen verstanden haben, wird es einfacher, Spring Security für Ihre Webanwendung zu konfigurieren und anzupassen.
Wenn Sie mehr über Spring Security und seine Verwendung für SAML- und OAuth-Flows erfahren möchten, können Sie mein Buch Simplifying Spring Security kaufen.