У меня есть приложение Spring Boot, которое использует Spring Security для аутентификации и авторизации запросов с использованием JWT. Однако некоторые запросы должны выполняться только конкретным пользователем. Например:
GET /users/{id}/orders
должен возвращать список заказов, только если {id}
является текущим пользователем или текущий пользователь ADMIN
PUT /orders/{id}
должен редактировать заказ только в том случае, если его payer
- текущий пользователь
PUT /representation-requests/{id}/accept
должен работать только в том случае, если текущий пользователь является target
запроса на представление
Из-за использования JWT, способ I получить текущий идентификатор пользователя можно по
String userId = ((DecodedJWT) SecurityContextHolder.getContext().getAuthentication().getDetails()).getSubject();
Я реализовал это в различных методах служб, отвечающих за обработку каждого вызова API. У меня вопрос, есть ли более общий способ сделать это с помощью Spring Boot и Spring Security? Или это не стандартный вариант использования?
Я рассмотрел аннотацию @PreAuthorize
в контроллерах, но она не удовлетворяет моим потребностям, поскольку параметров URL недостаточно для проверки вложенных объектов. @PostAuthorize
в контроллерах кажется ближе, но из-за JWT я не мог заставить его работать (и это также кажется немного неуклюжим делать длинный код в аннотациях, не уверенный, что это лучше, чем делать это в самом сервисе). Я ценю указатель в правильном направлении.