You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Spring Security中为单个端点开放匿名访问(无需antMatchers)

解决方案

针对你的需求,有两种常用方式可以为单个端点开放未认证访问权限,即使它和其他请求方法共享同一路径:

方式一:通过SecurityFilterChain配置(推荐,集中管理)

你可以在SecurityFilterChain中通过请求方法+路径的组合精准开放权限,Spring Security支持针对特定HTTP方法的路径匹配,完全能解决同路径不同方法的权限区分问题。

修改你的WebSecurityConfig类,使用requestMatchers指定GET请求的/users路径允许匿名访问,其余请求保持认证要求:

import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
import static org.springframework.security.config.Customizer.withDefaults;
import org.springframework.http.HttpMethod;

@EnableWebSecurity // 启用Spring Security核心配置
public class WebSecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
                .authorizeHttpRequests((authorize) -> authorize
                        // 允许GET /users 无需认证
                        .requestMatchers(HttpMethod.GET, "/users").permitAll()
                        // 其余所有请求必须认证
                        .anyRequest().authenticated()
                )
                .httpBasic(withDefaults());
        return http.build();
    }
}

注:Spring Security 6.x版本推荐使用requestMatchers替代旧的antMatchers,语法更清晰且功能更强。

方式二:使用方法级安全注解(灵活,针对单个方法)

如果更倾向于在控制器方法上直接配置权限,可以开启Spring Security的方法级安全,通过注解单独开放某个端点:

  1. 首先在WebSecurityConfig类上添加@EnableMethodSecurity注解,启用方法级安全:
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;

@EnableWebSecurity
@EnableMethodSecurity // 开启方法级权限控制
public class WebSecurityConfig {
    // 原有的filterChain Bean保持不变
}
  1. 在需要开放权限的控制器方法上添加@PermitAll注解:
@RestController
@RequestMapping(path = "/users")
public class ExampleController {

    @GetMapping
    @PermitAll // 该方法允许未认证访问
    public List<Users> getUserList(@PathVariable String userId) {
        return this.userService.getUserList(userId);
    }

    @PostMapping
    public void createUser(@RequestBody User user) {
        this.userService.createUser(user);
    }
}

你也可以使用@PreAuthorize("permitAll()")替代@PermitAll,两者效果一致。

额外提示

你的getUserList方法中使用了@PathVariable String userId,但@GetMapping未定义对应路径变量(比如@GetMapping("/{userId}")),这会导致请求报错,建议修正路径或参数注解(比如改用@RequestParam)。

内容的提问来源于stack exchange,提问作者Lucas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 04:57:43