@[toc] Spring Security ist ein leistungsstarkes und hochgradig anpassbares Sicherheitsframework, das eine Komplettlösung zum Schutz von Spring-basierten Anwendungen bietet. In Spring Security ist der Pfadabgleich ein zentraler Bestandteil der Berechtigungskontrolle, die bestimmt, welche Anfragen auf bestimmte Ressourcen zugreifen können. In diesem Artikel wird die Pfadanpassungsstrategie in Spring Security ausführlich vorgestellt und entsprechende Codebeispiele bereitgestellt.
In der alten Version von Spring Security gab es viele Pfadvergleichsmethoden, aber die neue Version von Spring Security kapselt diese Methoden einheitlich und ruft die requestMatchers-Methode zur Verarbeitung auf:
public C requestMatchers(RequestMatcher... requestMatchers) {
Assert.state(!this.anyRequestConfigured, "Can't configure requestMatchers after anyRequest");
return chainRequestMatchers(Arrays.asList(requestMatchers));
}
Die requestMatchers-Methode empfängt einen Parameter vom Typ RequestMatcher. Diese Schnittstelle ist ein Tool, mit dem ermittelt werden kann, ob eine HTTP-Anfrage mit einem bestimmten Muster übereinstimmt. Diese Schnittstelle bietet eine flexible Möglichkeit, Regeln für den Anforderungsabgleich zu definieren, sodass unterschiedliche Sicherheitsrichtlinien für unterschiedliche Anforderungen implementiert werden können.
In der neuen Version von Spring Security sind unterschiedliche Pfadanpassungs-Unterschemata tatsächlich unterschiedliche Implementierungsklassen von RequestMatcher.
1. AntPathRequestMatcher
AntPathRequestMatcher
Ist einer der am häufigsten verwendeten Anforderungs-Matcher in Spring, der Pfadmuster im Ant-Stil verwendet, um Anforderungs-URIs abzugleichen.
1.1 Was ist ein Pfadmuster im Ant-Stil?
Der Pfadvergleich im Ant-Stil (Ant Path Matching) ist eine Mustervergleichsregel für den Ressourcenstandort, die aus dem Java-Build-Tool Apache Ant stammt. In Ant wird dieser Modus verwendet, um Dateien und Verzeichnisse im Dateisystem anzugeben. Aufgrund seiner Einfachheit und Flexibilität werden Pfadmuster im Ant-Stil auch von vielen anderen Frameworks und Anwendungen übernommen, einschließlich Spring Security.
Pfadmuster im Ant-Stil verwenden einige Sonderzeichen, um verschiedene Ebenen der Pfadübereinstimmung darzustellen:
-
?
: Entspricht jedem einzelnen Zeichen (außer Pfadtrennzeichen). -
*
: Entspricht einer Folge beliebiger Zeichen (außer Pfadtrennzeichen), mit Ausnahme der leeren Zeichenfolge. -
**
: Entspricht einer beliebigen Zeichenfolge, einschließlich der leeren Zeichenfolge. Entspricht einer Sequenz aus mindestens einem Zeichen und kann Pfadtrennzeichen umfassen. -
{}
: Gibt eine Platzhalterauswahl an, die mit mehreren durch Kommas getrennten Mustern übereinstimmen kann. Beispielsweise{,春夏秋冬}
kann jede Zeichenfolge, die mit „Frühling“, „Sommer“, „Herbst“ oder „Winter“ beginnt, abgeglichen werden. -
[]
: In einigen Implementierungen kann es verwendet werden, um ein einzelnes Zeichen in Klammern abzugleichen. -
()
: Kann in einigen Implementierungen für den Gruppenabgleich verwendet werden.
In Spring Security werden häufig Pfadmuster im Ant-Stil verwendet, um die Zuordnung zwischen URL-Pfaden und Sicherheitskonfigurationen zu definieren. Sie können beispielsweise Pfadmuster im Ant-Stil verwenden, um anzugeben, welche URL-Pfade bestimmte Berechtigungen oder Rollen erfordern.
Hier sind einige Beispiele für Pfadmuster im Ant-Stil:
-
/users/*
: Entspricht/users/
jedem Pfad, der mit beginnt, z. B./users/123
oder/users/profile
. -
/users/**
: Entspricht/users/
jedem Pfad, der mit beginnt, einschließlich Unterpfaden wie/users/123
oder/users/profile/picture
. -
/users/123
: Genaue Übereinstimmung/users/123
. -
/users/{id}
: Obwohl es sich hierbei nicht um ein Muster im Ant-Stil handelt, demonstriert es die Übereinstimmung von Pfadparametern, die mit usw. übereinstimmen können/users/123
./users/456
-
/files/**.{jpg,png}
: Entspricht/files/
allen Dateipfaden, die mit.jpg
oder enden, beispielsweise oder ..png
/files/image1.jpg
/files/folder/image.png
Durch die Verwendung von Pfadmustern im Ant-Stil können Sie komplexe URL-Abgleichsregeln flexibel definieren, um sie an unterschiedliche Sicherheitsanforderungen anzupassen.
1.2 Grundlegende Verwendung
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
// 创建 AntPathRequestMatcher 实例
RequestMatcher antMatcher = new AntPathRequestMatcher("/users/**", "GET");
// 使用 matcher 进行匹配
boolean isMatch = antMatcher.matches(request);
1.3 Platzhalter
?
Entspricht einem beliebigen einzelnen Zeichen.*
Entspricht einer beliebigen Zeichenfolge (jedoch nicht den Verzeichnistrennzeichen).**
Entspricht jeder Zeichenfolge, einschließlich Verzeichnistrennzeichen.
// 匹配 /admin 下的任何资源,包括子目录
RequestMatcher adminMatcher = new AntPathRequestMatcher("/admin/**");
// 匹配 /files 目录下的任何 HTML 文件
RequestMatcher fileMatcher = new AntPathRequestMatcher("/files/*.{html,htm}", "GET");
2. RegexRequestMatcher
RegexRequestMatcher
Verwenden Sie reguläre Ausdrücke, um den angeforderten URI und die HTTP-Methode abzugleichen.
2.1 Grundlegende Verwendung
import org.springframework.security.web.util.matcher.RegexRequestMatcher;
// 创建 RegexRequestMatcher 实例
RequestMatcher regexMatcher = new RegexRequestMatcher("^/api/.*", "GET");
// 使用 matcher 进行匹配
boolean isMatch = regexMatcher.matches(request);
2.2 Verwendung regulärer Ausdrücke
// 匹配任何以 /api 开头的 URI
RequestMatcher apiMatcher = new RegexRequestMatcher("^/api/.*");
// 匹配任何 HTTP 方法
RequestMatcher anyMethodMatcher = new RegexRequestMatcher("^/.*", "GET|POST|PUT|DELETE");
2.3 Kombiniert mit Spring Security
Der folgende Code fängt alle Anfragen ab, die mit html, css und js enden. Auf diese Anfragen kann direkt zugegriffen werden:
@Configuration
public class SecurityConfig {
@Bean
SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests(a -> a.requestMatchers(new RegexRequestMatcher("^.*\\.(htm|css|js)$","GET")).permitAll())
.formLogin(Customizer.withDefaults())
.csrf(c -> c.disable());
return http.build();
}
}
3. RequestHeaderRequestMatcher
RequestHeaderRequestMatcher
Wird zum Abgleichen von Schlüsseln und Werten in Anforderungsheadern verwendet.
import org.springframework.security.web.util.matcher.RequestHeaderRequestMatcher;
// 创建 RequestHeaderRequestMatcher 实例
RequestMatcher headerMatcher = new RequestHeaderRequestMatcher("User-Agent", "Mozilla.*");
// 使用 matcher 进行匹配
boolean isMatch = headerMatcher.matches(request);
Insbesondere in Spring Security ist die Verwendung wie folgt:
@Configuration
public class SecurityConfig {
@Bean
SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests(a -> a.requestMatchers(new RequestHeaderRequestMatcher("User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36")).permitAll())
.formLogin(Customizer.withDefaults())
.csrf(c -> c.disable());
return http.build();
}
}
4. NegatedRequestMatcher
NegatedRequestMatcher
Ermöglicht Ihnen, eine vorhandene RequestMatcher
Übereinstimmung zu negieren.
import org.springframework.security.web.util.matcher.NegatedRequestMatcher;
// 创建一个 matcher,然后否定它的匹配结果
RequestMatcher notAdminMatcher = new NegatedRequestMatcher(adminMatcher);
// 使用 negated matcher 进行匹配
boolean isNotMatch = notAdminMatcher.matches(request);
Der folgende Code gibt beispielsweise an, dass auf /hello
alle Adressen außer , direkt zugegriffen werden kann:
@Configuration
public class SecurityConfig {
@Bean
SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests(a -> a.requestMatchers(new NegatedRequestMatcher(new AntPathRequestMatcher("/hello"))).permitAll())
.formLogin(Customizer.withDefaults())
.csrf(c -> c.disable());
return http.build();
}
}
5. AndRequestMatcher 和 OrRequestMatcher
AndRequestMatcher
und OrRequestMatcher
werden jeweils verwendet, um mehrere RequestMatcher
Instanzen zu kombinieren, um eine logische Zuordnung von „AND“ oder „OR“ durchzuführen.
5.1 AndRequestMatcher
import org.springframework.security.web.util.matcher.AndRequestMatcher;
// 组合多个 matcher 进行“与”匹配
RequestMatcher andMatcher = new AndRequestMatcher(apiMatcher, headerMatcher);
// 使用 andMatcher 进行匹配
boolean isMatch = andMatcher.matches(request);
5.2 OrRequestMatcher
import org.springframework.security.web.util.matcher.OrRequestMatcher;
// 组合多个 matcher 进行“或”匹配
RequestMatcher orMatcher = new OrRequestMatcher(adminMatcher, fileMatcher);
// 使用 orMatcher 进行匹配
boolean isMatch = orMatcher.matches(request);
6. Zusammenfassung
Spring bietet eine Vielzahl von RequestMatcher
Implementierungsklassen, um unterschiedliche Anforderungen an den Anforderungsabgleich zu erfüllen. Durch den geeigneten Einsatz dieser Matcher können Sicherheitsrichtlinien flexibel definiert und implementiert werden. In tatsächlichen Anwendungen müssen Sie möglicherweise einen geeigneten Matcher basierend auf den Geschäftsanforderungen auswählen und ihn mit der Spring Security-Konfiguration kombinieren, um eine differenzierte Zugriffskontrolle zu implementieren.