Pfadanpassungsschema in der neuesten Version von Spring Security!

@[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

AntPathRequestMatcherIst 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:

  1. ?: Entspricht jedem einzelnen Zeichen (außer Pfadtrennzeichen).

  2. *: Entspricht einer Folge beliebiger Zeichen (außer Pfadtrennzeichen), mit Ausnahme der leeren Zeichenfolge.

  3. **: Entspricht einer beliebigen Zeichenfolge, einschließlich der leeren Zeichenfolge. Entspricht einer Sequenz aus mindestens einem Zeichen und kann Pfadtrennzeichen umfassen.

  4. {}: 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.

  5. []: In einigen Implementierungen kann es verwendet werden, um ein einzelnes Zeichen in Klammern abzugleichen.

  6. (): 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/123oder /users/profile.

  • /users/**: Entspricht /users/jedem Pfad, der mit beginnt, einschließlich Unterpfaden wie /users/123oder /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 .jpgoder 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

RegexRequestMatcherVerwenden 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

RequestHeaderRequestMatcherWird 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

NegatedRequestMatcherErmö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 /helloalle 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

AndRequestMatcherund OrRequestMatcherwerden jeweils verwendet, um mehrere RequestMatcherInstanzen 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 RequestMatcherImplementierungsklassen, 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.

Linus hat es sich zur Aufgabe gemacht, zu verhindern, dass Kernel-Entwickler Tabulatoren durch Leerzeichen ersetzen. Sein Vater ist einer der wenigen Führungskräfte, die Code schreiben können, sein zweiter Sohn ist Direktor der Open-Source-Technologieabteilung und sein jüngster Sohn ist ein Open-Source-Core Mitwirkender : Natürliche Sprache wird immer weiter hinter Huawei zurückfallen: Es wird 1 Jahr dauern, bis 5.000 häufig verwendete mobile Anwendungen vollständig auf Hongmeng migriert sind Der Rich - Text-Editor Quill 2.0 wurde mit einer deutlich verbesserten Erfahrung von Ma Huateng und „ Meta Llama 3 “ veröffentlicht Quelle von Laoxiangji ist nicht der Code, die Gründe dafür sind sehr herzerwärmend. Google hat eine groß angelegte Umstrukturierung angekündigt
{{o.name}}
{{m.name}}

Ich denke du magst

Origin my.oschina.net/lenve/blog/11053987
Empfohlen
Rangfolge