Spring 安全性 - POST antMatcher 的方法(不是 antMatchers)

Spring Security - POST method for antMatcher (not antMatchers)

我有两个配置:

@订单(1)

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.antMatcher("/api/**")
        .authorizeRequests()
        .anyRequest().hasRole("USER")
        .and()
        .httpBasic()
        .and()
        .csrf().disable()
        .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        .and()
        .exceptionHandling()
        .authenticationEntryPoint(new ApiAuthenticationEntryPoint(objectMapper));
}

@订单(2)

http.authorizeRequests()
    .antMatchers("/product/**").hasRole(SecurityRoles.USER)
    .and()
    .formLogin()
    .loginPage("/login")
    .loginProcessingUrl("/authenticateTheUser")
    .successHandler(customAuthenticationSuccessHandler)
    .permitAll()
    .and()
    .logout()
    .permitAll()
    .and()
    .exceptionHandling()
    .accessDeniedPage("/access-denied");

我需要添加功能以在没有身份验证的情况下使用 REST 端点 /api/users 注册新用户。其他 /api/** 端点应保留基本身份验证。这该怎么做?我看不到带有选择 http 方法类型选项的方法 antMatcher

编辑:

我需要这样的东西:

http.antMatcher("/api/users", HttpMethod.POST.toString).permitAll()
    .and()
    .antMatcher("/api/**")
            .authorizeRequests()
            .anyRequest().hasRole("USER")
(...)

不过您可以使用 antMatchers() 做到这一点:

http
    .antMatcher("/api/**")
        .authorizeRequests()
            .antMatchers(HttpMethod.POST, "/api/user").permitAll()
            .anyRequest().hasRole("USER")

antMatcher(..)antMatchers(..) 之间的区别在于,当您有单独的安全配置 class 时,您使用 antMatcher(..)。当您需要区分以下内容时,这可能是必要的:

  • 身份验证机制(表单登录、基本身份验证...)
  • CSRF 处理
  • 会话管理
  • 过滤器
  • 用户详情服务
  • ...

另一方面,antMatchers(..)(在 authorizeRequests(..) 内)用于区分授权级别(哪些角色可以访问特定端点)。

在你的情况下,配置属于后者,因为你只需要区分 POST /api/user 端点的权限。


但是,如果您确实需要更精细地控制应该应用的安全配置 class,那么您应该使用评论中提到的 RequestMatcher

此界面有一个 HttpServletRequest 参数,并希望您 return 一个 boolean。由于 HttpServletRequest 包含您需要的所有信息,例如路径和 HTTP 方法,您可以适当调整 class 应该应用的配置。但是,在这种情况下没有必要。