You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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());
}

额外注意点

  1. 角色前缀一致性:如果安全配置中使用hasRole("ADMIN"),Spring Security会自动给角色添加ROLE_前缀,此时需要在转换权限时手动加上该前缀;若使用hasAuthority("ADMIN"),则直接用角色名称即可。
  2. 确保角色字段加载:验证从MongoDB查询用户时,roles字段被正确加载,未被忽略或映射错误。

内容的提问来源于stack exchange,提问作者Thegargcoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 23:32:18