Как разрешить вызов REST в Spring только для пользователя, модифицирующего себя? - PullRequest
0 голосов
/ 20 октября 2019

У меня есть

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

Я знаю, что могу использовать @PreAuthorize для защиты метода в зависимости от вашей роли. Но я хочу разрешить этот вызов API только для пользователя, редактирующего себя. Как это можно сделать?

Ответы [ 2 ]

1 голос
/ 20 октября 2019

В @PreAuthorize вы можете использовать SpEL для доступа к свойству входного аргумента. Он также предоставляет встроенное выражение authentication для доступа к экземпляру Authentication (и ярлык principal для доступа к Authentication.getPrincipal()) из текущей SecurityContext.

Для проверки подлинности JDBC по умолчанию:основной является тот экземпляр UserDetails, который не хранит идентификатор пользователя. Поэтому я предлагаю вам настроить его, чтобы включить идентификатор пользователя. После этого вы можете сделать что-то вроде:

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

}
0 голосов
/ 20 октября 2019

В обычном случае со стороны клиента будет присутствовать токен, который отправляется на каждый запрос пользователя на сервер. Вы можете идентифицировать пользователя на основе этого токена и проверить идентификатор пользователя с переданным идентификатором в конечной точке, если оба совпадения позволят выполнить действие или выдать ошибку в соответствии с требованиями.

IMO для этого вида аннотации нетпотребительная случай. Все аннотации, такие как @PreAuthorize, @Security и методы защиты, такие как configure(WebSecurity web), configure(HttpSecurity http), работают для определенных конечных точек и ролей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...