Spring Security过滤器链配置:用户自注册接口403错误排查与解决
Spring Security 3.x 无授权接口放行问题解决及管理员接口配置方案
问题场景
基于Java 17 + Spring Boot 3.0 + 最新版Spring Security搭建电商系统,需求是放行无需Token的公开接口(如商品列表GET、用户自注册POST等)。目前已成功放行登录和商品列表GET请求,但用户自注册接口始终返回403无权限错误,尝试多种requestMatchers配置均无效:
- 匹配
/api/v1/user/** - 指定POST方法匹配
/api/v1/user/** - 直接精确匹配
/api/v1/user/self-registration
同时存在配置疑问:使用.requestMatchers(HttpMethod.GET, "/api/v1/products/**").permitAll()会放行该路径下所有GET请求,无法区分公开商品列表和管理员专属商品接口。
排查过程
查看Spring Security安全日志发现:
POST /api/v1/user/self-registration实际已被授权放行- 后续触发的
POST /error请求因未认证被拒绝,根源是接口本身存在404错误,跳转至错误页面时未放行错误请求 - 最终定位到控制器路径拼写错误:配置中使用
/self-registration,但实际控制器映射路径为/selfregistration
解决方案
- 修正路径一致性:确保控制器的请求映射路径与Spring Security配置中的路径完全统一(比如统一为
/api/v1/user/selfregistration) - 调整Security配置:将所有无需授权的接口统一添加到
requestMatchers并设置permitAll(),示例配置如下:
@Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(auth -> auth // 放行登录、自注册等公开接口 .requestMatchers("/api/v1/auth/**", "/api/v1/user/selfregistration").permitAll() // 仅放行公开商品列表接口 .requestMatchers(HttpMethod.GET, "/api/v1/products").permitAll() // 管理员专属商品接口需认证且拥有ADMIN权限 .requestMatchers(HttpMethod.GET, "/api/v1/products/{id}/admin-detail", "/api/v1/products/admin/**") .hasAuthority("ADMIN") // 其余所有请求需认证 .anyRequest().authenticated() ) // 前后端分离项目可关闭CSRF .csrf(csrf -> csrf.disable()); return http.build(); } }
管理员专属商品接口配置建议
- 避免模糊匹配:不要直接用
/api/v1/products/**放行所有GET请求,而是精确匹配公开路径(如/api/v1/products对应商品列表) - 划分权限路径:将管理员专属接口归类到特定子路径(如
/api/v1/products/admin/)或使用带标识的精确路径(如/api/v1/products/{id}/admin-detail) - 权限校验方式:结合
hasAuthority()、hasRole()等方法实现细粒度权限控制,根据系统权限体系选择合适的校验逻辑
内容的提问来源于stack exchange,提问作者asdrubalo
相关产品推荐
相关产品推荐

