Spring Security角色认证403错误原因及解决方案
问题分析与解决
问题原因
你的配置存在两个核心问题导致403禁止错误:
缺少登录认证流程配置
你只定义了资源的授权规则,但没有配置Spring Security的登录机制。当用户访问/user或/admin这类受保护接口时,Spring Security无法引导用户完成认证流程,直接返回403。CSRF防护的影响(测试场景下)
Spring Security默认开启CSRF防护,如果通过Postman等非浏览器客户端直接访问接口,未携带CSRF Token的话,也会触发403错误。
另外需要确认:你是否在访问接口前完成了用户登录?未认证的用户访问受保护资源必然会被拒绝。
解决方法
1. 添加登录流程配置
修改securityFilterChain方法,添加formLogin()配置,开启默认的表单登录功能,让用户可以通过登录获取认证信息:
@Bean SecurityFilterChain securityFilterChain(HttpSecurity http, HandlerMappingIntrospector introspector) throws Exception { MvcRequestMatcher.Builder mvcMatcherBuilder = new MvcRequestMatcher.Builder(introspector); http.authorizeHttpRequests((requests) -> requests .requestMatchers(mvcMatcherBuilder.pattern("/home")).permitAll() .requestMatchers(mvcMatcherBuilder.pattern("/admin")).hasRole("ADMIN") .requestMatchers(mvcMatcherBuilder.pattern("/user")).hasRole("USER") .anyRequest().authenticated() ) // 添加表单登录配置,开放登录页面权限 .formLogin(form -> form.permitAll()); return http.build(); }
2. 针对非浏览器客户端的CSRF处理(仅测试用)
如果用Postman等工具测试接口,可以临时关闭CSRF防护(生产环境不建议):
@Bean SecurityFilterChain securityFilterChain(HttpSecurity http, HandlerMappingIntrospector introspector) throws Exception { MvcRequestMatcher.Builder mvcMatcherBuilder = new MvcRequestMatcher.Builder(introspector); http.authorizeHttpRequests((requests) -> requests .requestMatchers(mvcMatcherBuilder.pattern("/home")).permitAll() .requestMatchers(mvcMatcherBuilder.pattern("/admin")).hasRole("ADMIN") .requestMatchers(mvcMatcherBuilder.pattern("/user")).hasRole("USER") .anyRequest().authenticated() ) .formLogin(form -> form.permitAll()) // 关闭CSRF防护(仅测试场景使用) .csrf(csrf -> csrf.disable()); return http.build(); }
3. 角色配置验证
你的角色配置是正确的:roles("USER")会自动为用户添加ROLE_USER权限,hasRole("USER")也会自动匹配ROLE_USER前缀,这部分无需修改。
测试步骤
- 启动应用后,访问
/user或/admin,会自动跳转到Spring Security默认的登录页面 - 使用
user/password登录后,即可访问/user接口;使用admin/password登录后,即可访问/admin接口
内容的提问来源于stack exchange,提问作者Passion First
相关产品推荐
相关产品推荐

