SpringBoot中ADMIN角色用户调用/admin/getAllUsers API返回403 Forbidden问题
SpringBoot ADMIN角色访问授权API返回Forbidden问题解决
问题背景
在SpringBoot项目中,我创建了/admin/getAllUsers接口,并配置该接口仅允许ADMIN角色访问,但持有ADMIN角色的用户调用接口时,返回403 Forbidden错误,无法获取MongoDB中的所有注册用户。
相关代码与信息
Users实体类代码
@Data @NoArgsConstructor public class Users implements UserDetails{ @Id private ObjectId userid; @Indexed @NonNull private String userName; @NonNull private String password; @DBRef private List<JournalEntry> journalEntries = new ArrayList<>(); private List<String> roles; @Override public Collection<? extends GrantedAuthority> getAuthorities() { return null; } @Override public String getUsername() { return this.userName; } @Override public boolean isAccountNonExpired() { return true; } @Override public boolean isAccountNonLocked() { return true; } @Override public boolean isCredentialsNonExpired() { return true; } @Override public boolean isEnabled() { return true; } }
关键信息转述
- 安全配置类:配置了
/admin/**路径需ADMIN角色权限,通过Spring Security的authorizeHttpRequests设置访问规则。 - 接口定义:
/admin/getAllUsers为GET请求,用于查询所有用户数据。 - 用户数据库记录:目标用户的
roles字段值为["ADMIN"]。 - 请求错误:Postman返回403 Forbidden,提示权限不足。
问题原因
核心问题在于Users类的getAuthorities()方法返回null,Spring Security无法识别用户的角色权限,导致权限校验不通过,返回Forbidden。
解决方案
修改getAuthorities()方法,将用户的roles转换为Spring Security可识别的GrantedAuthority集合:
import org.springframework.security.core.authority.SimpleGrantedAuthority; import java.util.Collections; import java.util.stream.Collectors; @Override public Collection<? extends GrantedAuthority> getAuthorities() { if (roles == null || roles.isEmpty()) { return Collections.emptyList(); } // 根据安全配置的规则选择是否添加ROLE_前缀 return roles.stream() // 若配置用hasRole("ADMIN"),则改为new SimpleGrantedAuthority("ROLE_" + role) .map(SimpleGrantedAuthority::new) .collect(Collectors.toList()); }
额外注意点
- 角色前缀一致性:如果安全配置中使用
hasRole("ADMIN"),Spring Security会自动给角色添加ROLE_前缀,此时需要在转换权限时手动加上该前缀;若使用hasAuthority("ADMIN"),则直接用角色名称即可。 - 确保角色字段加载:验证从MongoDB查询用户时,
roles字段被正确加载,未被忽略或映射错误。
内容的提问来源于stack exchange,提问作者Thegargcoder
相关产品推荐
相关产品推荐

