Spring Boot 3.2.4角色权限配置问题:USER角色无法访问指定端点
问题原因
Spring Security的请求授权规则是从上到下依次匹配,一旦匹配到就会应用对应的权限规则。你的配置中先定义了/assignment/**需要ADMIN角色,这意味着所有以/assignment/开头的请求都会先匹配这条规则,包括/assignment/getGroceries和/assignment/order/**。当USER角色访问这些端点时,会被这条规则拦截,检查是否有ADMIN角色,自然返回403禁止访问。
修复方案
调整规则顺序,把更具体的端点权限规则放在前面,先定义USER角色可访问的端点,再定义剩余/assignment/**端点需要ADMIN角色的规则。修改后的SecurityFilterChain配置如下:
@Bean public SecurityFilterChain web(HttpSecurity http) throws Exception { http .csrf(AbstractHttpConfigurer::disable) .authorizeHttpRequests((authorize) -> authorize // 先配置USER角色可访问的具体端点 .requestMatchers( "/assignment/getGroceries", "/assignment/order/**") .hasRole("USER") // 再配置剩余/assignment/**端点需要ADMIN角色 .requestMatchers("/assignment/**") .hasRole("ADMIN") // 其他所有请求需要认证 .anyRequest() .authenticated() ) .httpBasic(Customizer.withDefaults()); return http.build(); }
额外说明
- 你的用户配置是正确的:ADMIN同时拥有USER和ADMIN角色,所以修改后ADMIN依然可以访问所有
/assignment/下的端点,包括USER权限的端点。 - 保留
@EnableMethodSecurity注解可支持后续方法级别的权限控制,当前基于URL的配置已满足需求。
内容的提问来源于stack exchange,提问作者Abhishek Patil
相关产品推荐
相关产品推荐

