Как реализовать политику JavaScript для членства в группах в Keycloak - PullRequest
0 голосов
/ 04 сентября 2018

A 2-летний вопрос списка пользователей keycloak без ответа:

  1. есть защищенный ресурс с именем Проект
  2. и владелец - Руководитель проекта
  3. Каждый руководитель проекта имеет доступ только к своим собственным проектам (политика только для владельцев).
  4. Руководители проектов, в свою очередь, отчитываются перед одним или несколькими Портфельными менеджерами . Менеджер портфолио должен иметь доступ ко всем проектам своих менеджеров проектов (политика portforlio-manager).

Давайте предположим, что дизайн системы является гибким, и этот факт, кто является менеджерами портфеля для конкретного менеджера проекта может храниться как внутри Keycloak (но не как keycloak groups ), так и в самом клиентском приложении. Как это может быть реализовано как на основе JavaScrtipt политика авторизации в Keycloak? Я полагаю, что запрос может быть каким-то образом введен с этой информацией, но он не может понять это из документов.

1 Ответ

0 голосов
/ 31 октября 2018

Оказалось довольно легко. Я решил сохранить информацию о менеджерах в другой базе данных, а затем приложение (service-nodejs) должно передать эту информацию в качестве претензии к Keycloak. Я проверил это на быстром запуске keycloak service-nodejs. Вот соответствующие части:

// app.js route:

app.get('/service/project/:id',
  keycloak.enforcer(['Project'], {
      response_mode: 'permissions', 
      claims: (request) => {
          return { "portfolio.managers": ['alice', 'bob'] } //hard-coded
      }
  }), function(req, res) {
      res.json({ message: `got project "operation "` });
  });

Политика защиты ресурса проекта представляет собой совокупность OwnerOnly и PortfolioManager:

// portfolio-managers-policy:

var context = $evaluation.getContext();
var identity = context.getIdentity();
var userid = identity.getAttributes().getValue('preferred_username').asString(0);
var managers =  context.getAttributes().getValue('portfolio.managers')

if (!managers) {
    print('managers not provided, cannot decide!');
    $evaluation.deny();
} else {
    // check if the user is one of the portfolio managers of this project:
    for (var i = 0; i < managers.size(); i++) {
        if (managers.asString(i) == userid) {
            $evaluation.grant();
            break;
        }
    }
}

Обратите внимание, что клиент service-nodejs keycloak должен быть конфиденциальным для вызова конечной точки токена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...