@[toc] Spring Security est un framework de sécurité puissant et hautement personnalisable qui fournit une solution complète pour protéger les applications basées sur Spring. Dans Spring Security, la correspondance de chemin est un élément essentiel du contrôle des autorisations, qui détermine quelles requêtes peuvent accéder à des ressources spécifiques. Cet article présentera en détail la stratégie de correspondance de chemin dans Spring Security et fournira des exemples de code correspondants.
Dans l'ancienne version de Spring Security, il existait de nombreuses méthodes de correspondance de chemin, mais la nouvelle version de Spring Security encapsule uniformément ces méthodes et appelle la méthode requestMatchers pour le traitement :
public C requestMatchers(RequestMatcher... requestMatchers) {
Assert.state(!this.anyRequestConfigured, "Can't configure requestMatchers after anyRequest");
return chainRequestMatchers(Arrays.asList(requestMatchers));
}
La méthode requestMatchers reçoit un paramètre de type RequestMatcher. RequestMatcher est une interface Cette interface est un outil utilisé pour déterminer si une requête HTTP correspond à un modèle donné. Cette interface offre un moyen flexible de définir des règles de correspondance de requêtes, afin que différentes politiques de sécurité puissent être mises en œuvre pour différentes requêtes.
Ainsi, dans la nouvelle version de Spring Security, différents sous-schémas de correspondance de chemin sont en fait différentes classes d'implémentation de RequestMatcher.
1. AntPathRequestMatcher
AntPathRequestMatcher
Est l'un des comparateurs de requêtes les plus couramment utilisés au Spring, qui utilise des modèles de chemin de style Ant pour faire correspondre les URI de requête.
1.1 Qu'est-ce qu'un modèle de chemin de style fourmi
La correspondance de chemin de style Ant (Ant Path Matching) est une règle de correspondance de modèles pour l'emplacement des ressources, qui provient de l'outil de construction Java Apache Ant. Dans Ant, ce mode est utilisé pour spécifier les fichiers et répertoires dans le système de fichiers. En raison de leur simplicité et de leur flexibilité, les modèles de chemin de style Ant sont également adoptés par de nombreux autres frameworks et applications, notamment Spring Security.
Les modèles de chemin de style fourmi utilisent des caractères spéciaux pour représenter différents niveaux de correspondance de chemin :
-
?
: correspond à n'importe quel caractère (sauf les séparateurs de chemin). -
*
: correspond à une séquence de n'importe quel caractère (à l'exception des séparateurs de chemin), à l'exclusion de la chaîne vide. -
**
: correspond à n'importe quelle séquence de caractères, y compris la chaîne vide. Correspond à une séquence d'au moins un caractère et peut s'étendre sur des séparateurs de chemin. -
{}
: indique une sélection générique pouvant correspondre à plusieurs modèles séparés par des virgules. Par exemple,{,春夏秋冬}
n'importe quelle chaîne commençant par le printemps, l'été, l'automne ou l'hiver peut être associée. -
[]
: Dans certaines implémentations, peut être utilisé pour faire correspondre un seul caractère entre parenthèses. -
()
: Dans certaines implémentations, peut être utilisé pour la correspondance de groupe.
Dans Spring Security, les modèles de chemin de style Ant sont souvent utilisés pour définir le mappage entre les chemins d'URL et les configurations de sécurité. Par exemple, vous pouvez utiliser des modèles de chemin de style Ant pour spécifier quels chemins d'URL nécessitent des autorisations ou des rôles spécifiques.
Voici quelques exemples de modèles de chemin de style Ant :
-
/users/*
: correspond à/users/
n'importe quel chemin commençant par , tel que/users/123
ou/users/profile
. -
/users/**
: correspond à/users/
n'importe quel chemin commençant par , y compris les sous-chemins tels que/users/123
ou/users/profile/picture
. -
/users/123
: Correspondance exacte/users/123
. -
/users/{id}
: Bien qu'il ne s'agisse pas d'un modèle de style Ant, il démontre la correspondance des paramètres de chemin, qui peuvent correspondre à/users/123
,/users/456
etc. -
/files/**.{jpg,png}
: correspond à/files/
tous les chemins de fichiers se terminant par.jpg
ou , tels que ou ..png
/files/image1.jpg
/files/folder/image.png
En utilisant des modèles de chemin de style Ant, vous pouvez définir de manière flexible des règles de correspondance d'URL complexes pour vous adapter aux différentes exigences de sécurité.
1.2 Utilisation de base
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
// 创建 AntPathRequestMatcher 实例
RequestMatcher antMatcher = new AntPathRequestMatcher("/users/**", "GET");
// 使用 matcher 进行匹配
boolean isMatch = antMatcher.matches(request);
1.3 Caractères génériques
?
Correspond à n’importe quel caractère.*
Correspond à n'importe quelle séquence de caractères (mais pas aux séparateurs de répertoire).**
Correspond à n'importe quelle séquence de caractères, y compris les séparateurs de répertoires.
// 匹配 /admin 下的任何资源,包括子目录
RequestMatcher adminMatcher = new AntPathRequestMatcher("/admin/**");
// 匹配 /files 目录下的任何 HTML 文件
RequestMatcher fileMatcher = new AntPathRequestMatcher("/files/*.{html,htm}", "GET");
2. RegexRequestMatcher
RegexRequestMatcher
Utilisez des expressions régulières pour faire correspondre l'URI et la méthode HTTP demandés.
2.1 Utilisation de base
import org.springframework.security.web.util.matcher.RegexRequestMatcher;
// 创建 RegexRequestMatcher 实例
RequestMatcher regexMatcher = new RegexRequestMatcher("^/api/.*", "GET");
// 使用 matcher 进行匹配
boolean isMatch = regexMatcher.matches(request);
2.2 Utiliser des expressions régulières
// 匹配任何以 /api 开头的 URI
RequestMatcher apiMatcher = new RegexRequestMatcher("^/api/.*");
// 匹配任何 HTTP 方法
RequestMatcher anyMethodMatcher = new RegexRequestMatcher("^/.*", "GET|POST|PUT|DELETE");
2.3 Combiné avec Spring Security
Le code suivant intercepte toutes les requêtes se terminant par html, css et js. Ces requêtes sont accessibles directement :
@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
Utilisé pour faire correspondre les clés et les valeurs dans les en-têtes de requête.
import org.springframework.security.web.util.matcher.RequestHeaderRequestMatcher;
// 创建 RequestHeaderRequestMatcher 实例
RequestMatcher headerMatcher = new RequestHeaderRequestMatcher("User-Agent", "Mozilla.*");
// 使用 matcher 进行匹配
boolean isMatch = headerMatcher.matches(request);
Plus précisément dans Spring Security, l'utilisation est la suivante :
@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
Vous permet d'annuler une RequestMatcher
correspondance existante.
import org.springframework.security.web.util.matcher.NegatedRequestMatcher;
// 创建一个 matcher,然后否定它的匹配结果
RequestMatcher notAdminMatcher = new NegatedRequestMatcher(adminMatcher);
// 使用 negated matcher 进行匹配
boolean isNotMatch = notAdminMatcher.matches(request);
Par exemple, le code suivant indique que /hello
toutes les adresses, à l'exception de , sont accessibles directement :
@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 et OrRequestMatcher
AndRequestMatcher
et OrRequestMatcher
sont respectivement utilisés pour combiner plusieurs RequestMatcher
instances pour effectuer une correspondance logique de « ET » ou « OU ».
5.1 EtRequestMatcher
import org.springframework.security.web.util.matcher.AndRequestMatcher;
// 组合多个 matcher 进行“与”匹配
RequestMatcher andMatcher = new AndRequestMatcher(apiMatcher, headerMatcher);
// 使用 andMatcher 进行匹配
boolean isMatch = andMatcher.matches(request);
5.2 OuRequestMatcher
import org.springframework.security.web.util.matcher.OrRequestMatcher;
// 组合多个 matcher 进行“或”匹配
RequestMatcher orMatcher = new OrRequestMatcher(adminMatcher, fileMatcher);
// 使用 orMatcher 进行匹配
boolean isMatch = orMatcher.matches(request);
6. Résumé
Spring propose une variété de RequestMatcher
classes d’implémentation pour répondre aux différents besoins de correspondance des requêtes. En utilisant ces matchers de manière appropriée, les politiques de sécurité peuvent être définies et mises en œuvre de manière flexible. Dans les applications réelles, vous devrez peut-être sélectionner un correspondant approprié en fonction des exigences de l'entreprise et le combiner avec la configuration Spring Security pour implémenter un contrôle d'accès précis.