我有
@PutMapping("/users/{id}")
@ResponseStatus(HttpStatus.ACCEPTED)
public User updateUser(@PathVariable("id") Long userId, @RequestBody User updatedUser){
...
}
我知道我可以根据您的角色使用@PreAuthorize保护该方法。但是我只允许用户自己编辑此API调用。该怎么办?
答案 0 :(得分:1)
在@PreAuthorize
中,可以使用SpEL来访问输入参数的属性。它还提供了从当前authentication
访问Authentication
实例的内置表达式principal
(和访问Authentication.getPrincipal()
的快捷方式SecurityContext
)。>
对于默认的JDBC身份验证,主体是不存储用户ID的UserDetails
实例。因此,我建议您自定义它以包括用户ID。之后,您可以执行以下操作:
@PutMapping("/users/{id}")
@ResponseStatus(HttpStatus.ACCEPTED)
@PreAuthorize("#updatedUser.userId == principal.userId")
public User updateUser(@PathVariable("id") Long userId, @RequestBody User updatedUser){
}