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中。