У меня есть веб-служба Spring, где пользователи имеют доступ только к определенным ресурсам. Любой пользователь может сделать запрос на получение информации о ресурсе, но мне нужно выбросить исключение авторизации, если у них нет доступа к этому ресурсу. API выглядит следующим образом:Spring Security Authorization
GET /resources/{resourceId}
Приведенный выше API предоставляет пользователю всю информацию о данном ресурсе.
В настоящее время я выполняю аутентификацию с использованием WebSecurityConfigurerAdapter
. Чтобы добавить авторизацию, я заметил, что я могу установить предоставленные полномочия как часть объекта проверки подлинности. При этом я могу использовать что-то вроде @PreAuthorize("hasRole('ROLE_USER')")
для выполнения авторизации.
Однако для упомянутого API я не уверен, что упомянутый подход авторизации подходит по следующим причинам.
- Я авторизуюсь на основании того, имеет ли пользователь права доступа к конкретному
resourceId
. Это не совсем определенная роль. Больше похоже на Привилегию. Можно ли использоватьhasRole()
для этого варианта использования? - Если бы я использовал аннотацию
hasRole()
, мне нужно было бы сделать что-то вроде@PreAuthorize("hasRole('ACCESS_RESOURCEID12346')")
, гдеRESOURCEID12346
-resourceId
. Но у нас есть только доступ кresourceId
, когда мы находимся в контроллере API. Итак, как я могу использовать это значение для аннотации авторизации?
Если указанный подход не является наилучшим способом решения проблемы, я был бы признателен за любые комментарии/комментарии о том, каким будет наилучший подход. Я бы хотел избежать этой проверки в контроллере. Я пытаюсь сделать это с помощью Spring Security, аналогично тому, как работает @PreAuthorize. Я думаю, что доступ к resourceId является требованием авторизации, и мы не должны даже попасть в контроллер API, если у пользователя нет доступа к этому ресурсу.
У вас есть информация о пользователе, поэтому я бы предоставил таблицу UserResouce в db и проверить отношения на get. – ChiefTwoPencils
1. Разве это не будет сочетать аутентификацию и авторизацию? Из моего понимания по дизайну лучше отделить аутентификацию и авторизацию. 2. Как получить доступ к ресурсу? Мне нужно проверить?Это зависит только от пути API. – AndroidDev93
Я не вижу, как это будет сочетаться. У вас есть auth через preauth на ROLE_USER? Итак, вы уже авторизованы, и у вас есть путь и идентификатор. Итак, сделав предположения, вы можете сделать 'getResourceByUserAndResourceId (...)', где запрос использует таблицу, упомянутую выше. – ChiefTwoPencils