Управление правами пользователей в API Keycloak и Spring Rest - PullRequest
0 голосов
/ 04 июня 2018

TL; DR

  • Цель: управление разрешениями API:
    • Поток прямого предоставления авторизации OIDC
    • Федерация пользователей иИсточник аутентификации: LDAP
    • Хранилище разрешений: устаревшая база данных
    • Управление клиентами и аутентификация: Keycloak
  • Вопрос: Каковы лучшие практики дляуправление правами пользователей в Keycloak и rest api?

Context

Мы реализуем API отдыха с пружиной, которая будет использоватьсямобильное приложение и SPA.Аккаунты наших пользователей, разрешения, правила ... и все данные хранятся в пользовательской базе данных, используемой различными монолитными приложениями.Для защиты нашего API мы решили использовать Keycloak.

Сервер Keycloak настроен с существующим LDAP для федерации пользователей и «Прямым потоком» для мобильного клиентского приложения.Для первого варианта использования (аутентификация) все работает нормально.

Теперь мы должны управлять разрешениями пользователей следующим образом:

  • Клиентские приложения должны знать разрешения пользователей на отображение/ скрыть функции

  • API должен иметь возможность проверять права пользователей для использования различных конечных точек

  • Права пользователей основаны на некоторых правилах в базе данныхи часто меняются

В моем понимании keycloak может обрабатывать авторизацию и детализированные разрешения, используя жестко заданные или пользовательские политики, но не может быть подключен к другому источнику авторизации.Как следствие, я подумал о создании настраиваемого сопоставителя ролей с использованием Keycloak SPI , получения пользовательских разрешений из настраиваемого API, который я разработаю, и сопоставления их с маркером доступа.

КакВ результате мой токен доступа должен выглядеть следующим образом:

"resource_access": {
    “My-client”: {
      “permissions”: [
        “Show-products”,
        “Buy-something”,
        “Display-prices”
      ]
    }
  },
  "username": “myUser”

Тогда мобильное приложение должно иметь возможность знать пользовательские разрешения на основе токена, а моя серверная часть без сохранения состояния (API) должна иметь доступ к пользовательским разрешениям накаждый вызов, чтобы проверить их с помощью весенней аннотации:

@PreAuthorize("hasRole('Show-products')")

Проблема

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

Поэтому мне было интересно:

  • Безопасно ли устанавливать права доступа пользователей для доступа?утверждения токена?
  • Как обезопасить доступ к внешней клавиатуре (остальные вызовы) для получения разрешений?
  • Следует ли мне полагаться на утверждения токенов для проверки прав доступа пользователей к каждому запросу на моем сервере ресурсов?
  • Существуют ли какие-либо другие чистые решения / передовые практики для обработки разрешений пользователей из внешнего источника в keycloak?

Дополнительная информация

Я использую:

  • Springboot 1.5.13.RELEASE
  • Keycloak-adapter-bom 3.4.3.Final
  • Автономный сервер Keycloak 3.4.3.Final
...