如何在Spring Security中仅允许/info端点使用GET请求?
实现Spring Security中/info端点仅允许GET请求的配置方法
完全可以在当前的SecurityFilterChain配置中实现这个需求,只需要给antMatchers指定对应的HTTP方法即可,无需修改控制器或路径。
修改后的完整配置代码如下:
import org.springframework.http.HttpMethod @Bean fun filterChain(http: HttpSecurity): SecurityFilterChain { http .csrf().disable() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .authorizeHttpRequests() { it.antMatchers("/auth/**").permitAll() // 仅允许GET方法访问/info端点,无需认证 it.antMatchers(HttpMethod.GET, "/info").permitAll() // 其他所有请求必须经过认证 it.anyRequest().authenticated() } .exceptionHandling().authenticationEntryPoint(HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED)) return http.build() }
配置逻辑说明:
- 通过
antMatchers(HttpMethod.GET, "/info")精准限定:只有GET请求的/info端点允许无认证访问; it.anyRequest().authenticated()确保其他所有请求(包括POST/PUT等非GET方法的/info)都需要携带合法认证信息;- 当非GET方法访问
/info且未提供认证信息时,会触发你配置的HttpStatusEntryPoint直接返回HTTP 401未授权响应,完全匹配你的需求。
控制器注解方案的问题:
你之前使用@PreAuthorize返回403是因为该注解触发的是权限不足的AccessDeniedException,而你需要的是未认证的AuthenticationException——只有后者会被authenticationEntryPoint处理并返回401。通过SecurityFilterChain的HTTP方法匹配配置,能直接把非GET的/info请求纳入认证校验流程,自然会返回正确的响应状态码。
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

