Spring Boot авторизация в сервисах - PullRequest
1 голос
/ 17 марта 2020

У меня есть приложение 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 я не мог заставить его работать (и это также кажется немного неуклюжим делать длинный код в аннотациях, не уверенный, что это лучше, чем делать это в самом сервисе). Я ценю указатель в правильном направлении.

1 Ответ

2 голосов
/ 17 марта 2020

Вам придется немного поиграться с этим (я не могу дать вам 100% -ную специфику для JWT), но вы можете использовать SpEL для достижения того, чего вы хотите. (Я не уверен, почему вы думаете, что @PostAuthorize может быть более подходящим, хотя)

Как и так, для простых проверок (# обозначает параметр метода)

@PreAuthorize("principal?.id == #id")
public List<Order> ordersForUsers(Integer id) {
    // do someting
}

Или вот так делегирование пользовательскому компоненту (@ обозначает имя компонента, ha sh параметр метода, 'admin' нужную роль или любой другой параметр, действительно)

@PreAuthorize("@yourBean.hasPermission(principal, #id, 'admin')")
public List<Order> ordersForUsers(Integer id) {
    // do someting
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...