#spring-boot #spring-security #amazon-cognito #spring-security-oauth2 #spring-rest
#spring-boot #spring-безопасность #amazon-cognito #spring-безопасность-oauth2 #spring-rest
Вопрос:
Я просмотрел множество сообщений и статей, но не нашел простого решения для приведенного ниже случая, которое я должен реализовать.
Платформа: Spring Boot 2.x.x (Spring Security 5.x.x) со встроенным Tomcat
Решение: служба REST, которая использует множество клиентских приложений и множество конечных пользователей.
-
Я должен реализовать конечную точку REST
/api/search
, доступную для многих клиентских приложений. В качестве примера можно привести веб-приложение APP-X (Angular), веб-приложение APP-Y (Jquery / Bootstrap) и мобильное приложение APP-Z (IOS). Все три клиента являются отдельными объектами (как с технической точки зрения, так и с точки зрения бизнеса). -
Итак, я должен аутентифицировать вышеупомянутое приложение, используя одноразовый токен. Поэтому я планировал перейти на Spring OAuth2, включив
@EnableAuthorizationServer
и@EnableResourceServer
. Для каждого клиента приложения я сгенерирую токен, и они смогут использовать его при подключении к моей службе REST. Верен ли этот подход? -
Помимо приложений-клиентов, система имеет возможность регистрировать и входить в систему для конечных пользователей. Также моя конечная точка (
/api/search
) может получать доступ как к анонимным пользователям, так и к пользователям, которые зарегистрировались подROLE_REGUSER
ролью. И через контекст безопасности мне нужно получить доступ к данным пользователя как к обычной аутентификации пользователя. -
Это то место, где я застрял. Как я могу выполнить следующие пункты вместе, используя Spring Security 5.x.x (Spring Boot 2.x.x).
I. Аутентификация как клиентских приложений, так и конечных пользователей.
II. Разрешить доступ для анонимных пользователей и зарегистрированных пользователей для одной и той же конечной точки.
Я приложил небольшую диаграмму для разработки вышеупомянутого сценария.
Спасибо
Ответ №1:
Я нашел решение, когда обновил свою версию spring security до 5.2.
В версии 5.2 они обесценились @EnableAuthorizationServer
и @EnableResourceServer
. Поэтому мне пришлось перейти к внешнему поставщику авторизации, который поддерживает auth2. Я выбрал AWS Cognito и выполнил вышеуказанное требование, используя опцию пула пользователей.
- Я создал пул пользователей.
- Затем создал два клиента приложений в одном пуле пользователей.
- Один клиент приложения настроен как поддержка потока учетных данных клиента.
- Второй клиент приложения настроен как поддержка потока аутентификации пользователя.
- Извлекайте токен доступа непосредственно из AWS Cognito, используя учетные данные клиента, и используйте для защиты всех вызовов API.
- Если пользователь входит в систему на любом этапе, извлеките токен доступа непосредственно из AWS Cognito, используя код авторизации, и замените любой существующий токен доступа.
Преимущество заключается в том, что сервер ресурсов может проверять любой маркер доступа, который сгенерирован, связанный с тем же пулом пользователей.