Вы подняли отличную точку.XACML был разработан для того, что я бы назвал авторизация транзакций , то есть авторизация конкретной транзакции или потока.Например:
- Политика : Медсестра может просматривать медицинскую карту пациента в своем отделении.
- Запрос : Может Джомедсестра просматривает медицинскую карту # 123?
Задача состоит в том, чтобы контролировать доступ к большому или даже неизвестному количеству предметов.В этом случае вы можете (теоретически) просто отправить большое количество запросов.Вы могли бы даже использовать Профиль множественных решений XACML , который позволяет создавать запросы, такие как:
- Запрос : Может ли Джо медсестра просмотреть медицинскую карту #123, # 124, # 125, # 126 ...?
Затем вы получите столько ответов, сколько было элементов MDP в запросе.Вы даже можете сделать матрицу, например,
- Запрос : Может ли Джо просмотреть медсестру и отредактировать медицинскую карту # 123, # 124, # 125, # 126 ...?
- Ответ : 2x4 = 8 решений.
Однако, он все еще не так хорошо масштабируется (он может доходить до тысяч, но вряд ли миллионов) и выигралне работает в сценариях нумерации страниц и когда вы не знаете, сколько предметов у вас есть.Он не работает при разбиении на страницы, потому что представьте, что вы извлекаете 10 элементов (с помощью нумерации страниц), которые вы будете отображать, а затем авторизуете каждый.Вы рискуете иметь менее 10 элементов на своей странице, что нарушает возможности пользователей.
В своем вопросе вы ссылаетесь на использование обязательств и рекомендаций.Это вариант, но вы правы насчет недостатка.Он скрывает семантику authZ в рекомендациях и усложняет отдельный случай.Это то, что ваша политика стала бы
- Политика : медсестра может просмотреть медицинскую карту пациента + обязательство: фильтр в отделении
Это требует значительных усилий для точки реализации политики (PEP).
Так в чем же альтернатива?
Использование обратного запроса (ARQ)
Аксиоматика(который - отказ от ответственности - это то, где я работаю) придумал новый API поверх PDP, который позволяет вам запрашивать политики открытым способом, называемый Reverse Query .Вот сообщение для разработчика по теме.
Вместо того, чтобы отправлять полномасштабные запросы XACML, вы отправляете частичный запрос (открытый вопрос), например,
Запрос может быть настолько общим или конкретным, насколько это необходимо.Ниже приведены все действительные запросы:
- Что может произойти?
- Что может сделать Алиса?
- Что может посмотреть Алиса?
- Какой медицинскийзапись может просматривать Алиса?
- Какую медицинскую карту в отделении ER можно просматривать Алису?
- ...
Ответом будет набор выражений фильтра, вычисленных изправила, которые должны быть соблюдены.
С учетом ранее заявленной политики
- Политика : Медсестра может просматривать медицинскую карту пациента в своем отделении.
- Метаданные пользователя: Алиса работает медсестрой в больнице округа Кук в Чикаго в отделении онкологии.
Возможные ответы:
- Что может произойти?
- Ответ : Медсестра может просмотреть медицинскую карту пациента в своем отделении.
- Что может сделать Алиса?
- Ответ : просмотреть медицинскую карту пациента в онкологии.
- Что может увидеть Алиса?
- Ответ : медицинская карта пациента в онкологии.
- Какую медицинскую карту может просматривать Алиса?
- Ответ : один из пациентов в онкологии.
- Какую медицинскую карту в отделении ER может просматривать Алиса?
Запросы в примере выше сосредоточены на Алисе.Вместо этого вы могли бы сосредоточиться на ресурсе (медицинской карте) или даже на действии.Вы можете выбирать.
Надеюсь, это поможет, Дэвид.