Spring Security 如何验证用户是否为对象的所有者

fruv7luv  于 2022-12-18  发布在  Spring
关注(0)|答案(1)|浏览(126)

在我的项目中,我有3个实体:A * 用户**、项目任务。用户可以创建任务,但任务属于项目而不是他自己,并且项目中可以有多个用户。

data class User(
  val userId: String,
)

data class Project(
  val projectId: String,
  val taskIds: List<String>,
  val userIds: List<String>
)

data class Task(
  val taskId: String
)

那么,如果数据结构是这样的,我如何使用**@PreAuthorize来验证Task**是否属于用户所在的项目?

@PreAuthorize("authentication.principal.userId == #???")
@GetMapping("/task/{taskId}")
public Task getTask(String taskId) {
}
hfsqlsce

hfsqlsce1#

您可以在SpEl表达式中引用路径变量(或使用@RequestBody和@RequestHeader注解的变量),引用时在变量名的开头加上#符号。

@PreAuthorize("principal.userId == #taskId")
@GetMapping("/task/{taskId}")
public Task getTask(@PathVariable String taskId) {
    // ...
}

如果您想检查返回的Task示例的id是否与主体的id匹配,则需要使用@PostAuthorized(* @PreAuthorize是不可行的,因为需要执行该方法来评估条件,即您需要首先获取对象,以确定该用户是否可以访问它 *)。
要在SpEl中引用该方法生成的对象,请使用returnObject(不要在前面添加散列符号)。

@PostAuthorize("principal.userId == returnObject.taskId")
@GetMapping("/task/{taskId}")
public Task getTask(@PathVariable String taskId) {
    // ...
}

相关问题