Esquema de correspondência de caminho na versão mais recente do Spring Security!

@[toc] Spring Security é uma estrutura de segurança poderosa e altamente personalizável que fornece uma solução completa para proteger aplicativos baseados em Spring. No Spring Security, a correspondência de caminho é uma parte essencial do controle de permissão, que determina quais solicitações podem acessar recursos específicos. Este artigo apresentará detalhadamente a estratégia de correspondência de caminho no Spring Security e fornecerá exemplos de código correspondentes.

Na versão antiga do Spring Security, havia muitos métodos de correspondência de caminho, mas a nova versão do Spring Security encapsula uniformemente esses métodos e chama o método requestMatchers para processamento:

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

O método requestMatchers recebe um parâmetro do tipo RequestMatcher é uma interface. Esta interface é uma ferramenta usada para determinar se uma solicitação HTTP corresponde a um determinado padrão. Essa interface fornece uma maneira flexível de definir regras de correspondência de solicitações, para que diferentes políticas de segurança possam ser implementadas para diferentes solicitações.

Portanto, na nova versão do Spring Security, diferentes subesquemas de correspondência de caminhos são, na verdade, diferentes classes de implementação do RequestMatcher.

1. AntPathRequestMatcher

AntPathRequestMatcherÉ um dos matchers de solicitação mais comumente usados ​​no Spring, que usa padrões de caminho no estilo Ant para corresponder aos URIs de solicitação.

1.1 O que é padrão de caminho estilo Ant

A correspondência de caminho no estilo Ant (Ant Path Matching) é uma regra de correspondência de padrões para localização de recursos, que se origina da ferramenta de construção Java Apache Ant. No Ant, este modo é usado para especificar arquivos e diretórios no sistema de arquivos. Devido à sua simplicidade e flexibilidade, os padrões de caminho estilo Ant também são adotados por muitas outras estruturas e aplicações, incluindo Spring Security.

Os padrões de caminho no estilo Ant usam alguns caracteres especiais para representar diferentes níveis de correspondência de caminho:

  1. ?: Corresponde a qualquer caractere único (exceto separadores de caminho).

  2. *: corresponde a uma sequência de quaisquer caracteres (exceto separadores de caminho), excluindo a string vazia.

  3. **: corresponde a qualquer sequência de caracteres, incluindo a string vazia. Corresponde a uma sequência de pelo menos um caractere e pode abranger separadores de caminho.

  4. {}: indica uma seleção de curinga que pode corresponder a vários padrões separados por vírgula. Por exemplo, {,春夏秋冬}qualquer sequência que comece com primavera, verão, outono ou inverno pode ser correspondida.

  5. []: em algumas implementações, pode ser usado para corresponder a um único caractere entre parênteses.

  6. (): Em algumas implementações, pode ser usado para correspondência de grupo.

No Spring Security, padrões de caminho no estilo Ant são frequentemente usados ​​para definir o mapeamento entre caminhos de URL e configurações de segurança. Por exemplo, você pode usar padrões de caminho no estilo Ant para especificar quais caminhos de URL exigem permissões ou funções específicas.

Aqui estão alguns exemplos de padrões de caminho no estilo Ant:

  • /users/*: corresponde /users/a qualquer caminho que comece com , como /users/123ou /users/profile.

  • /users/**: corresponde /users/a qualquer caminho que comece com , incluindo subcaminhos como /users/123ou /users/profile/picture.

  • /users/123: Combinação exata /users/123.

  • /users/{id}: embora este não seja um padrão no estilo Ant, ele demonstra a correspondência de parâmetros de caminho, que pode corresponder a /users/123, /users/456etc.

  • /files/**.{jpg,png}: Corresponde /files/a todos os caminhos de arquivo que terminam com .jpgou , como ou ..png/files/image1.jpg/files/folder/image.png

Ao usar padrões de caminho no estilo Ant, você pode definir com flexibilidade regras complexas de correspondência de URL para se adaptar a diferentes requisitos de segurança.

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 Curingas

  • ?Corresponde a qualquer caractere único.
  • *Corresponde a qualquer sequência de caracteres (mas não aos separadores de diretório).
  • **Corresponde a qualquer sequência de caracteres, incluindo separadores de diretório.
// 匹配 /admin 下的任何资源,包括子目录
RequestMatcher adminMatcher = new AntPathRequestMatcher("/admin/**");

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

2. RegexRequestMatcher

RegexRequestMatcherUse expressões regulares para corresponder ao URI solicitado e ao 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 Usando expressões regulares

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

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

2.3 Combinado com Spring Security

O código a seguir intercepta todas as solicitações que terminam em html, css e js. Essas solicitações podem ser acessadas diretamente:

@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

RequestHeaderRequestMatcherUsado para combinar chaves e valores em cabeçalhos de solicitação.

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

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

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

Especificamente no Spring Security, o uso é o seguinte:

@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

NegatedRequestMatcherPermite negar uma RequestMatchercorrespondência existente.

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

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

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

Por exemplo, o código a seguir indica que /hellotodos os endereços, exceto , podem ser acessados ​​diretamente:

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

AndRequestMatchere OrRequestMatchersão usados ​​respectivamente para combinar múltiplas RequestMatcherinstâncias para realizar a correspondência lógica de "AND" ou "OR".

5.1AndRequestMatcher

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

Spring fornece uma variedade de RequestMatcherclasses de implementação para atender a diferentes necessidades de correspondência de solicitações. Ao usar esses matchers de maneira adequada, as políticas de segurança podem ser definidas e implementadas de maneira flexível. Em aplicativos reais, pode ser necessário selecionar um correspondente apropriado com base nos requisitos de negócios e combiná-lo com a configuração do Spring Security para implementar um controle de acesso refinado.

Linus assumiu a responsabilidade de evitar que os desenvolvedores do kernel substituíssem tabulações por espaços. Seu pai é um dos poucos líderes que sabe escrever código, seu segundo filho é o diretor do departamento de tecnologia de código aberto e seu filho mais novo é um núcleo de código aberto. contribuidor Robin Li: A linguagem natural se tornará uma nova linguagem de programação universal. O modelo de código aberto ficará cada vez mais atrás da Huawei: levará 1 ano para migrar totalmente 5.000 aplicativos móveis comumente usados ​​para Hongmeng. vulnerabilidades de terceiros. O editor de rich text Quill 2.0 foi lançado com recursos, confiabilidade e desenvolvedores. A experiência foi bastante melhorada. fonte de Laoxiangji não é o código, as razões por trás disso são muito comoventes. O Google anunciou uma reestruturação em grande escala.
{{o.nome}}
{{m.nome}}

Acho que você gosta

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