¡Esquema de coincidencia de rutas en la última versión de Spring Security!

@[toc] Spring Security es un marco de seguridad potente y altamente personalizable que proporciona una solución completa para proteger aplicaciones basadas en Spring. En Spring Security, la coincidencia de rutas es una parte central del control de permisos, que determina qué solicitudes pueden acceder a recursos específicos. Este artículo presentará en detalle la estrategia de coincidencia de rutas en Spring Security y proporcionará los ejemplos de código correspondientes.

En la versión anterior de Spring Security, había muchos métodos de coincidencia de rutas, pero la nueva versión de Spring Security encapsula estos métodos de manera uniforme y llama al método requestMatchers para su procesamiento:

public C requestMatchers(RequestMatcher... requestMatchers) {
	Assert.state(!this.anyRequestConfigured, "Can't configure requestMatchers after anyRequest");
	return chainRequestMatchers(Arrays.asList(requestMatchers));
}

El método requestMatchers recibe un parámetro de tipo RequestMatcher. RequestMatcher es una interfaz. Esta interfaz es una herramienta utilizada para determinar si una solicitud HTTP coincide con un patrón determinado. Esta interfaz proporciona una forma flexible de definir reglas de coincidencia de solicitudes, de modo que se puedan implementar diferentes políticas de seguridad para diferentes solicitudes.

Entonces, en la nueva versión de Spring Security, los diferentes subesquemas de coincidencia de rutas son en realidad diferentes clases de implementación de RequestMatcher.

1. AntPathRequestMatcher

AntPathRequestMatcherEs uno de los comparadores de solicitudes más utilizados en Spring, que utiliza patrones de ruta estilo Ant para hacer coincidir los URI de solicitud.

1.1 ¿Qué es el patrón de ruta estilo hormiga?

La coincidencia de ruta estilo Ant (Ant Path Matching) es una regla de coincidencia de patrones para la ubicación de recursos, que se origina en la herramienta de compilación de Java Apache Ant. En Ant, este modo se utiliza para especificar archivos y directorios en el sistema de archivos. Debido a su simplicidad y flexibilidad, muchos otros marcos y aplicaciones, incluido Spring Security, también adoptan patrones de ruta estilo Ant.

Los patrones de ruta estilo hormiga utilizan algunos caracteres especiales para representar diferentes niveles de coincidencia de rutas:

  1. ?: Coincide con cualquier carácter (excepto los separadores de ruta).

  2. *: Coincide con una secuencia de cualquier carácter (excepto los separadores de ruta), excluyendo la cadena vacía.

  3. **: Coincide con cualquier secuencia de caracteres, incluida la cadena vacía. Coincide con una secuencia de al menos un carácter y puede abarcar separadores de ruta.

  4. {}: Indica una selección comodín que puede coincidir con varios patrones separados por comas. Por ejemplo, {,春夏秋冬}se puede combinar cualquier cadena que comience con primavera, verano, otoño o invierno.

  5. []: En algunas implementaciones, se puede utilizar para hacer coincidir un solo carácter entre paréntesis.

  6. (): En algunas implementaciones, se puede utilizar para la coincidencia de grupos.

En Spring Security, los patrones de ruta estilo Ant se usan a menudo para definir el mapeo entre rutas URL y configuraciones de seguridad. Por ejemplo, puede utilizar patrones de ruta estilo Ant para especificar qué rutas URL requieren permisos o roles específicos.

A continuación se muestran algunos ejemplos de patrones de ruta estilo Ant:

  • /users/*: Coincide con /users/cualquier ruta que comience con , como /users/123o /users/profile.

  • /users/**: Coincide con /users/cualquier ruta que comience con , incluidas subrutas como /users/123o /users/profile/picture.

  • /users/123: Coincidencia exacta /users/123.

  • /users/{id}: Aunque este no es un patrón estilo Ant, demuestra la coincidencia de parámetros de ruta, que pueden coincidir /users/123, /users/456etc.

  • /files/**.{jpg,png}: Coincide con /files/todas las rutas de archivos que terminan en .jpgo , como o ..png/files/image1.jpg/files/folder/image.png

Al utilizar patrones de ruta estilo Ant, puede definir de manera flexible reglas complejas de coincidencia de URL para adaptarse a diferentes requisitos de seguridad.

1.2 Uso básico

import org.springframework.security.web.util.matcher.AntPathRequestMatcher;

// 创建 AntPathRequestMatcher 实例
RequestMatcher antMatcher = new AntPathRequestMatcher("/users/**", "GET");

// 使用 matcher 进行匹配
boolean isMatch = antMatcher.matches(request);

1.3 comodines

  • ?Coincide con cualquier carácter individual.
  • *Coincide con cualquier secuencia de caracteres (pero no con separadores de directorio).
  • **Coincide con cualquier secuencia de caracteres, incluidos los separadores de directorio.
// 匹配 /admin 下的任何资源,包括子目录
RequestMatcher adminMatcher = new AntPathRequestMatcher("/admin/**");

// 匹配 /files 目录下的任何 HTML 文件
RequestMatcher fileMatcher = new AntPathRequestMatcher("/files/*.{html,htm}", "GET");

2. Coincidencia de solicitudes de expresiones regulares

RegexRequestMatcherUtilice expresiones regulares para hacer coincidir el URI solicitado y el método HTTP.

2.1 Uso básico

import org.springframework.security.web.util.matcher.RegexRequestMatcher;

// 创建 RegexRequestMatcher 实例
RequestMatcher regexMatcher = new RegexRequestMatcher("^/api/.*", "GET");

// 使用 matcher 进行匹配
boolean isMatch = regexMatcher.matches(request);

2.2 Usar expresiones regulares

// 匹配任何以 /api 开头的 URI
RequestMatcher apiMatcher = new RegexRequestMatcher("^/api/.*");

// 匹配任何 HTTP 方法
RequestMatcher anyMethodMatcher = new RegexRequestMatcher("^/.*", "GET|POST|PUT|DELETE");

2.3 Combinado con Spring Security

El siguiente código intercepta todas las solicitudes que terminan en html, css y js. Se puede acceder a estas solicitudes directamente:

@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. Solicitar encabezadoRequestMatcher

RequestHeaderRequestMatcherSe utiliza para hacer coincidir claves y valores en los encabezados de solicitud.

import org.springframework.security.web.util.matcher.RequestHeaderRequestMatcher;

// 创建 RequestHeaderRequestMatcher 实例
RequestMatcher headerMatcher = new RequestHeaderRequestMatcher("User-Agent", "Mozilla.*");

// 使用 matcher 进行匹配
boolean isMatch = headerMatcher.matches(request);

Específicamente en Spring Security, el uso es el siguiente:

@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. Matcher de solicitudes negadas

NegatedRequestMatcherLe permite negar una RequestMatchercoincidencia existente.

import org.springframework.security.web.util.matcher.NegatedRequestMatcher;

// 创建一个 matcher,然后否定它的匹配结果
RequestMatcher notAdminMatcher = new NegatedRequestMatcher(adminMatcher);

// 使用 negated matcher 进行匹配
boolean isNotMatch = notAdminMatcher.matches(request);

Por ejemplo, el siguiente código indica que /hellose puede acceder directamente a todas las direcciones excepto a:

@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 y OrRequestMatcher

AndRequestMatchery OrRequestMatcherse utilizan respectivamente para combinar múltiples RequestMatcherinstancias para realizar una coincidencia lógica de "Y" u "O".

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. Resumen

Spring proporciona una variedad de RequestMatcherclases de implementación para satisfacer diferentes necesidades de coincidencia de solicitudes. Al utilizar estos comparadores de manera adecuada, las políticas de seguridad se pueden definir e implementar de manera flexible. En aplicaciones reales, es posible que deba seleccionar un comparador adecuado según los requisitos comerciales y combinarlo con la configuración de Spring Security para implementar un control de acceso detallado.

Linus se encargó de evitar que los desarrolladores del kernel reemplazaran las pestañas con espacios. Su padre es uno de los pocos líderes que puede escribir código, su segundo hijo es el director del departamento de tecnología de código abierto y su hijo menor es un núcleo de código abierto. Colaborador Robin Li: El lenguaje natural se convertirá en un nuevo lenguaje de programación universal. El modelo de código abierto se quedará cada vez más atrás de Huawei: tomará 1 año migrar completamente 5,000 aplicaciones móviles de uso común a Hongmeng, que es el lenguaje más propenso. Vulnerabilidades de terceros. Se lanzó el editor de texto enriquecido Quill 2.0 con características, confiabilidad y experiencia de desarrolladores que Ma Huateng y Zhou Hongyi se dieron la mano para "eliminar los rencores". La fuente de Laoxiangji no es el código, las razones detrás de esto son muy conmovedoras. Google anunció una reestructuración a gran escala.
{{o.nombre}}
{{m.nombre}}

Supongo que te gusta

Origin my.oschina.net/lenve/blog/11053987
Recomendado
Clasificación