【发布时间】:2020-04-10 23:35:21
【问题描述】:
我在我的授权服务器中创建了userinfo 端点。
@GetMapping("/userinfo")
public Principal me(Principal principal) {
return principal;
}
它返回这个 JSON:
{
...
"userAuthentication": {
...
"principal": {
"id": 2,
"username": "xyz",
"password": "......",
"accountNonExpired": true,
"accountNonLocked": true,
"credentialsNonExpired": true,
"enabled": true,
"authorities": [
{
"authority": "ROLE_DONOR"
}
],
"createdAt": "2019-11-08T20:50:46"
},
...
"name": "xyz"
},
...
"principal": {
"id": 2,
"username": "xyz",
"password": "......",
"accountNonExpired": true,
"accountNonLocked": true,
"credentialsNonExpired": true,
"enabled": true,
"authorities": [
{
"authority": "ROLE_DONOR"
}
],
"createdAt": "2019-11-08T20:50:46"
},
...
"name": "xyz"
}
在我的一个资源服务器用户服务 API 中,我尝试 sysout Principal 的值来查看它的值:
@GetMapping("/{id}")
public ResourceResponseDto findById(@PathVariable("id") long id, Principal principal) throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
String x = objectMapper.writeValueAsString(principal);
System.out.println(x);
return ...;
}
principal 的值不同。其值相当于上面的principal.username,省略其他字段:
{
"userAuthentication": {
...
"principal": "xyz",
...
"name": "xyz"
},
...
"principal": "xyz",
...
"name": "xyz"
}
这是怎么发生的?
我需要获取id 的值,但它已经消失了。 principalobject 的字段消失了。这导致我认为我的其他方法出错:
@GetMapping("/{id}")
@PreAuthorize("hasRole('ADMIN') or #id == principal.id")
public ResourceResponseDto findById(@PathVariable("id") long id) {
//
}
我收到此错误;
Failed to evaluate expression 'hasRole('ADMIN') or #id == principal.id'
请帮忙。谢谢。
【问题讨论】:
-
首先检查
Principal在每种情况下的什么类。
标签: java spring spring-boot spring-security spring-security-oauth2