Spring-Boot @PreAuthorize разрешает работу только для администратора или если идентифицированный идентификатор пользователя совпадает с идентификатором параметра пути - PullRequest
0 голосов
/ 12 января 2019

У меня есть контроллер с пользовательскими операциями CRUD.

@Controller
public class UserController {

  // @TODO need to check whether userId == authUser.id or authUser is admin??
  //
  @PreAuthorize("hasRole('ROLE_ADMIN) or ...???...")
  @PostMapping("/user/{id}/edit")
  public boolean editUser(@PathVariable("id") long userId,
                          @RequestBody User newUserObj,
                          @CurrentUser authUser) {
     // I don't like to always call a helper function from here
     // check(authUser.getId() == userId);

     return userService.edit(userId, newUserObj);
  }

 // ... rest of the methods

}

Эта операция разрешена только для администратора или самого пользователя. Ни один пользователь не может редактировать профили других пользователей.

Я пробовал @PreAuthorize("hasRole('ROLE_ADMIN')), он работает только для пользователя с правами администратора, но я хочу проверить, является ли аутентифицированный пользователь тем же пользователем, который указан параметром userId (authUser.getId() == userId). Как я могу определить это выражение внутри аннотации? Это возможно без написания вспомогательной функции.

У меня также есть текущий аутентифицированный пользователь, введенный в метод контроллера с использованием аннотации @CurrentUser, в случае необходимости.

1 Ответ

0 голосов
/ 12 января 2019

Весенние документы должны быть полезны здесь. https://docs.spring.io/spring-security/site/docs/3.0.x/reference/el-access.html

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

@PreAuthorize("hasRole('ROLE_ADMIN) or #authUser.id == #userId")
...