为什么有管理员权限,Token正确,访问却是403

http://localhost:8080/users?page=1&size=5访问 Bearer 返回403

http://localhost:8080/auth/me 返回如下:

json 复制代码
{
    "userId": 1,
    "username": "admin",
    "nickname": "超级管理员",
    "permissions": [
        "ROLE_ADMIN"
    ]
}

Permissions 里装的是角色 ROLE_ADMIN,注解要的是权限码 user:list------对不上,没有权限。

管理员为什么会没有权限呢?

less 复制代码
    @GetMapping("/me")
    public ResponseEntity<UserInfoResponse> me(@AuthenticationPrincipal LoginUser loginUser) {
        List<String> permissions = loginUser.getAuthorities().stream()
                .map(GrantedAuthority::getAuthority)
                .toList();
        return ResponseEntity.ok(UserInfoResponse.builder()
                .userId(loginUser.getUserId())
                .username(loginUser.getUsername())
                .nickname(loginUser.getNickname())
                .permissions(permissions)
                .build());
    }

可以看到permissions = loginUser.getAuthorities() 获取了securityContext里的authorities 接着ResponseEntity里面 .permissions(permissions) 说明,permissions里只有"ROLE_ADMIN" 没有"user:list"。

看到把permission放入上下文的JWTAuthenticationFilter的doFilterInternal方法

scss 复制代码
```
// 实时加载用户 + 权限(用户被删/禁用会抛 AuthenticationException,进 catch)
LoginUser loginUser = (LoginUser) userDetailsService.loadUserByUsername(username);
```
进入loadUserByUsername(username);

```

// 4. 查权限:超管绿灯直接拿权限表全量,普通用户按角色关联查
boolean isAdmin = roles.stream()
    .anyMatch(r -> "ROLE_ADMIN".equals(r.getCode()));
List<SysPermission> permissions;
if (isAdmin) {
    permissions = permissionMapper.selectList(null);   // MP BaseMapper 自带,查全表
} else {
    permissions = permissionMapper.selectByUserId(sysUser.getId());
}

// 5。组装进authorities
List<SimpleGrantedAuthority> authorities = Stream.concat(
            roles.stream().map(r -> new SimpleGrantedAuthority(r.getCode())),       // ROLE_ADMIN
            permissions.stream().map(p -> new SimpleGrantedAuthority(p.getCode()))) // user:delete
    .distinct()
    .toList();
```

可以确认,permissions是放入authorities中。

所以,是数据库表中没有对应user:list权限导致,去sys_permission表看code,确实没有,补充上即可。

相关推荐
拖孩4 小时前
AI 帮我写的小程序「厨菜记」上线满月了,挣了两百块!!!
前端·后端·微信小程序
流烟默4 小时前
SSE 实战:在 SpringBoot + Vue 项目中零依赖实现轻量级实时消息推送
vue.js·spring boot·后端·sse
upala4 小时前
【仓颉语言入门 · 第二篇 第 9 课】
后端
Rain的Java大神之路5 小时前
别再死磕 MySQL 了:向量数据库与 RAG 生产落地实录(Java 工程师专场)
java·后端·面试
雨中飘荡的记忆5 小时前
SDD × Claude Code:先写清楚,再让 AI 写代码
后端
Thneonl5 小时前
主从延迟 0 秒的谎言:SBM 的三个盲区
后端·架构
孙浩君5 小时前
0行手写代码,我用AI做了一个打工人模拟器(含3D霓虹城市漫游)
前端·后端
羑悻5 小时前
超越Bridge:全面掌握Docker网络隔离与通信的底层逻辑!
后端
他日若遂凌云志5 小时前
深入剖析 ET8 框架的 ETTask 机制:await 的挂起、唤醒、异常与零 GC
后端
星轨zb5 小时前
[支付专题4]支付回调幂等性和状态:状态机与终态检查的边界
后端·支付架构学习