Java >> Java Tutorial >  >> Tag >> Spring

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.


Java-Tag