Пожалуйста, не помечайте это как дубликат, поскольку имеющиеся решения содержат проблемы безопасности и не охватывают все 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) {
...
}
}
Пожалуйста, предоставьте чистое решение этой проблемы.
ОБНОВЛЕНИЕ - ЧАСТЬ РЕШЕНИЯ
Я не знал, что могу напрямую получить объект внутри заголовка метода, передав только идентификатор.
@GetMapping("/something/{id}")
fun getSomethingByID(@PathVariable(value = "id") something: Something): ResponseEntity<BasicDeliveryAddress> { ... }
С этой дополнительной информацией и ответом (принятым), предоставленным @Ken Chan, вы сможете легко реализовать безопасность на основе владения!