【发布时间】:2020-05-28 18:08:32
【问题描述】:
请不要将此标记为重复,因为提供的可用解决方案包含安全问题并且不涵盖所有 CRUD 案例!
我想通过将对象的存储userId 与SecurityContextHolder.getContext().authentication 进行比较来保护某些对象。
我知道我必须在执行操作之前获取对象,因为这是获取 userId 的唯一方法。
我想保护像这样的控制器方法:
@GetMapping("/deliveryAddresses/{id}")
fun getDeliveryAddressById(@PathVariable(value = "id") deliveryAddressId : Long):
ResponseEntity<BasicDeliveryAddress> {
return deliveryAddressService.findById(deliveryAddressId)?.let { ResponseEntity.ok(it) }
?: ResponseEntity.notFound().build()
}
保护此对象的最佳实践方法是什么?我不想在我的代码中进行多次重复的所有权检查。另外请建议在哪里添加检查(控制器,服务,...?)
这正是我想要避免的(伪代码):
fetchById(id) {
val myObject = ...
if(myObject.userId == authUser.userId) {
...
}
}
请为此问题提供一个干净的解决方案。
更新 - 解决方案的一部分
我不知道我可以通过仅传递 ID 来直接获取方法头中的对象。
@GetMapping("/something/{id}")
fun getSomethingByID(@PathVariable(value = "id") something: Something): ResponseEntity<BasicDeliveryAddress> { ... }
有了这些附加信息和@Ken Chan 提供的答案(已接受),您应该能够轻松实现基于所有权的安全性!
【问题讨论】:
-
对对象使用@PostFilter。 baeldung.com/spring-security-prefilter-postfilter
标签: spring kotlin spring-security