如何仅允许用户自行修改Spring中的REST调用?

时间:2019-10-20 01:44:51

标签: java spring spring-boot spring-mvc spring-security

我有

@PutMapping("/users/{id}")
@ResponseStatus(HttpStatus.ACCEPTED)
public User updateUser(@PathVariable("id") Long userId, @RequestBody User updatedUser){
...
}

我知道我可以根据您的角色使用@PreAuthorize保护该方法。但是我只允许用户自己编辑此API调用。该怎么办?

1 个答案:

答案 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){

}