了解spring-security上的requestMatchers()

ca1c2owp  于 2023-04-06  发布在  Spring
关注(0)|答案(3)|浏览(602)

我正在学习spring-security的一些代码,我想了解一下我在互联网上找到的这个例子1

http.requestMatchers()
        .antMatchers("/management/**") // (1)
        .and()
        .authorizeRequests() // (2)
        .antMatchers("/management/health")
        .permitAll()
        .antMatchers("/management/info")
        .permitAll()
        .antMatchers("/management/**")
        .hasRole("ACTUATOR")
        .anyRequest().permitAll()
        .and()
        .httpBasic(); (3)

}
我不明白这个配置,为什么这个代码:

http.requestMatchers()
        .antMatchers("/management/**")
        .and()

是否在.authorizeRequests()之前?(1)
那是什么意思?
你能解释一下这个例子吗?

**2:**第二种情况,有什么区别?

http.requestMatchers().antMatchers("/rest2/**")
.and()
.authorizeRequests()
.antMatchers("/rest/v1/test/hello").permitAll()
.antMatchers("/rest/v1/test/**").denyAll()
.and()
.requestMatchers().antMatchers("/rest/**")
.and()
.authorizeRequests()
.antMatchers("/rest/v1/test/hello").permitAll();

使用requestMatchers()有什么影响?
如果我向“/rest/v1/test/hello 2”发送请求,我会收到401 Why if the rule that deny a request does not match with the antMatchers(“/rest 2/**”)?

j8yoct9x

j8yoct9x1#

requestMatchers()的目的是指定Spring安全配置将应用于哪些请求。
例如,如果您有2个端点"/public""/private",并且您只希望将安全性(特别是csrf保护)应用于"/private",则可以添加以下配置:

http
    .requestMatchers()
        .antMatchers("/private/**")
        .and()
    .csrf();

然后,如果你POST到"/private",你会得到一个403响应。
但是如果你POST到"/public",你会得到200,因为没有应用安全性。
这与authorizeRequests不同,authorizeRequests指示该端点所需的访问类型,而不是是否应用安全性。
在你提到的例子1中

http
    .requestMatchers()
        .antMatchers("/management/**")
        .and() 
        ...

安全配置仅应用于"/management/**",因此如果您向"/foo"发出请求,它将不安全。
在你提到的例子2中,

http
    .requestMatchers()
        .antMatchers("/rest2/**")
        .and()
    .authorizeRequests()
        .antMatchers("/rest/v1/test/hello").permitAll()
        .antMatchers("/rest/v1/test/**").denyAll()
        .and()
    .requestMatchers()
        .antMatchers("/rest/**")
        .and()
    .authorizeRequests()
        .antMatchers("/rest/v1/test/hello").permitAll();

"/rest/v1/test/hello2"响应401的原因是因为"/rest/**"在请求匹配器中,因此您的安全规则.antMatchers("/rest/v1/test/hello").permitAll()将适用。
如果您向"/rest3/v1/test/hello2"发出请求,那么它将以200响应,因为"/rest3/**"不属于任何请求匹配器。

jk9hmnmh

jk9hmnmh2#

Sping Boot 3更新

WebSecurityConfigurerAdapter已被删除,Spring Security 5.5引入了一种使用SecurityFilterChain接口配置安全性的新方法-HttpSecurity构建器API已被弃用。
例如,为了允许在/public/上的请求和其他所有内容,同时保留ant-pattern注解,用途:

@Bean
  public SecurityFilterChain configure(HttpSecurity http) throws Exception {
    http
        .authorizeHttpRequests((requests) -> requests
            .requestMatchers(new AntPathRequestMatcher("/public/**")).permitAll()
            .anyRequest().authenticated()) //other URLs are only allowed authenticated users.
        .httpBasic();
    return http.build();
  }

“Authenticated users”的定义可以使用JwtTokenFilter扩展OncePerRequestFilter来指定(例如)。

nmpmafwu

nmpmafwu3#

Spring安全API:public final类HttpSecurity.RequestMatcherConfigurer扩展了AbstractRequestMatcherRegistry

允许Map此HttpSecurity将用于的HTTP请求

相关问题