为什么有管理员权限,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,确实没有,补充上即可。

相关推荐
lizhongxuan1 小时前
Agent Sandbox 怎么选
后端
nyaomaru1 小时前
你的 Type Guard 可能会悄悄地与 TypeScript 类型发生偏移 🔧
后端·typescript
明月_清风1 小时前
数据平台到底是什么?一篇文章搞懂数据平台开发
大数据·后端·数据分析
心之语歌1 小时前
DeerFlow Docker Desktop 部署教程
后端
美好世界1 小时前
Codex 源码导读:第二部分——一次 Turn 的完整生命周期
后端
据说幸运很容易1 小时前
接口测试框架重构:YAML 用例驱动 + 分层设计
后端·架构
海岳云舟1 小时前
SpringCloudGateway 动态转发后端服务
后端
我的div丢了肿么办1 小时前
自定义类型和类型别名以及实例化结构体的5种方式
后端·go
小满zs1 小时前
Go语言第十三章(互斥锁,读写锁)
后端·go