首页 > 解决方案 > 如何只允许用户修改自己在 Spring 中调用 REST?

问题描述

我有

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

我知道我可以使用 @PreAuthorize 来保护方法,具体取决于您的角色。但我只想让这个 API 调用只供用户编辑自己使用。如何才能做到这一点?

标签: javaspringspring-bootspring-mvcspring-security

解决方案


在 中@PreAuthorize,您可以使用 SpEL 来访问输入参数的属性。它还提供了一个内置表达式来authentication从当前的.AuthenticationprincipalAuthentication.getPrincipal()SecurityContext

对于默认的 JDBC 身份验证,主体是UserDetails不存储用户 ID 的实例。因此,我建议您对其进行自定义以包含用户 ID。之后,您可以执行以下操作:

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

}

推荐阅读