Использование областей в роли Spring Безопасность OAuth2 (поставщик)

Рассмотрим довольно простое гипотетическое приложение, в котором пользователи могут читать или писать сообщения.

Некоторые пользователи могут читать и писать статьи, а некоторые другие могут читать их только. С помощью Spring Security (3.2.1) я смоделировал это с помощью двух ролей:

  • ROLE_WRITE: эта роль предоставляет пользователям доступ к написанию сообщений.
  • ROLE_READ: эта роль предоставляет пользователям доступ к сообщениям для чтения.

Реализация этого с помощью Spring безопасности довольно проста...

Теперь я хочу также разрешить сторонним приложениям читать и писать сообщения от имени пользователей, внедряя поставщика OAuth2, используя Spring Security OAuth (версия 2.0.0.M3 ATM).

На этапе авторизации приложение запрашивает у пользователя, готовы ли они предоставить право читать и/или писать сообщения от их имени. Здесь пользователь предоставляет области (не роли).

Затем, когда потребитель OAuth2 вызывает мой REST API, Spring Sec OAuth авторизует предоставленный токен и создает аутентификацию, содержащую пользователя со всеми их ролями и только с предоставленными областями.

Проблема (и вопрос) заключается в том, что мне теперь приходится писать другую логику безопасности в зависимости от того, вызван ли API пользователем, обычно прошедшим проверку подлинности (просто проверьте роли), или он вызвал через OAuth2 (проверьте роли + области).

Возможно ли "объединить" понятия ролей и областей в Spring Security OAuth2, чтобы на этапе авторизации пользователь предоставил приложение подмножество ролей, которое они имеют (и проверить подлинность OAuth2 только в этих полномочиях)? Таким образом, когда стороннее приложение вызывает вызов API, роли в аутентификации являются предоставленными? Таким образом, мне не нужно писать какую-либо логику безопасности OAuth2.

Ответы

Ответ 1

Области (и роли) - это произвольные строки, поэтому нет проблем, если вы хотите сделать то же самое. Чтобы сделать объявления с правилами доступа одинаковыми, вы можете написать ExpressionHandler, которые проверяли полномочия или области с теми же значениями в зависимости от типа найденного Authentication.

При чтении комментариев появляется другой подход: добавьте пользовательские TokenStore или ResourceServerTokenServices. Это легкодоступные точки расширения и позволяют изменять OAuth2Authentication так, чтобы его предоставленные полномочия были такими же, как области.

Мое предпочтение, однако, состоит в том, чтобы управлять разрешенными областями с помощью OAuth2RequestFactory, ограничивая их в точке предоставления маркера равными значениям, которые согласуются с полномочиями пользователя.