Как работать с ролями в областях, когда в XACML можно активировать несколько ролей
Сначала пользователь может иметь несколько ролей одновременно, и эта роль имеет область действия. Например, один пользователь имеет три роли: /scopeA/editor, /scopeA/programmer, /scopeB/editor
и / scopeA / редактор имеет доступ к ресурсу /scopeA/post /scopeA/ программист имеет доступ к ресурсу /scopeA/bug
/scopeB/editor has access to resource /scopeB/post
поэтому возникает вопрос:
как я могу объявить политику, гласящую: если в ролевом пакете есть роль с именем "/XX/editor", то соответствующий пользователь имеет доступ к "/YY/post", когда "XX == YY"
Я нашел подобный вопрос здесь, и я предложил способ решения проблемы, но когда дело доходит до нескольких ролей (значение атрибута role является сумкой), мой ответ не верен. Поскольку значение атрибута role является сумкой, я не могу просто получить часть между первыми двумя косыми чертами значения атрибута роли и сравнить с таковой атрибута ресурса,
затем я попытался найти функцию мешка высшего порядка, чтобы сделать это, функция "urn:oasis:names:tc:xacml:3.0:function:any-of" может сделать это, но как насчет первого "аргумента функции" любая функция?
вот что я делаю: первый аргумент функции any-of - "string-equal", а второй аргумент - это функция, используемая для получения части между первыми двумя косыми чертами идентификатора resouce-id, третий аргумент - это Значение атрибута предмета, являющегося сумкой.
так что все, что мне нужно сделать, это определить функцию, чтобы получить часть между первыми двумя слешами, верно?
Есть ли лучший способ сделать то, что я хочу? если что-то неясно, пожалуйста, дайте мне знать, спасибо ~~
1 ответ
Это большой вопрос. Мы называем этот вопрос атрибутами отношений вызов. По сути, пользователь играет роль в данном контексте или области, как вы ее называете.
Если бы я читал роль пользователя из БД только на основании его имени, то я получал бы список ролей независимо от области действия, например, редактор, издатель, рецензент...
Это привело бы к риску, что я смогу отредактировать пост за рамками, для которых у меня есть подходящая роль.
Есть несколько способов решить эту проблему. Одним из способов является определение более строгих сопоставлений в информационной точке вашей политики.
Использование информационных точек политики
Предположим, что запрос XACML говорит: " Может ли Алиса редактировать пост 123? ". Ваша политика будет указывать (в синтаксисе ALFA):
policy editPost{
target clause resourceType=="post" and actionId=="edit"
apply firstApplicable
rule allowEditors{
target clause userRole=="editor"
permit
}
}
Понятие области действия непосредственно не отображается в политике. Основное сопоставление с источником атрибутов будет следующим:
- сопоставьте userRole с полем роли таблицы usersRoleAssignment, используя роль SELECT FROM usersRoleAssignment WHERE uid=? И сфера =?
- uid будет сопоставлен с идентификатором пользователя, который поступил в запросе XACML.
- область действия будет атрибутом ресурса, который также будет отображаться в PIP следующим образом
- сопоставить область действия с областью поля таблицы записей с помощью ВЫБРАТЬ область из сообщений ГДЕ pid =?
- pid будет сопоставлен с идентификатором рассматриваемой записи. Это также пришло в запросе XACML.
Это означает, что ваш атрибут userRole действительно должен называться scopedUserRole. Моделирование, которое я дал, является лишь одним примером. Есть несколько других способов моделирования с таким же эффектом. В любом случае, все тяжелые работы происходят внутри PIP. Основным недостатком является то, что вы теряете видимость семантики вашей логики авторизации.
Использование значений атрибутов и функций
Другим способом достижения аналогичного результата является сохранение отношения между областью действия и ролью в самом значении. Это то, на что вы намекаете в своем вопросе.
Вы можете использовать строковые функции, такие как строка-начинается-с или строка-заканчивается-с или строка-содержит, чтобы достичь того, что вас интересует. Есть также функция строка-регулярное выражение-соответствие, которую вы можете использовать.
Подробности о функциях можно найти в спецификации XACML 3.0.
Если функций недостаточно в XACML, вы можете:
- реализовать свой собственный
- реализовать PIP, который может обрабатывать значения ваших атрибутов и создавать новые. Подробнее о ПИПах здесь.
Создание нового типа данных с именем tuple
Проблема с XACML в том, что он выравнивает отношения. Использование нового типа данных с несколькими частями, т. Е. Кортежа, решит проблему. Это потребует пользовательского кодирования, хотя и довольно много работы.
Использование содержимого XML внутри запроса XACML
Если вся информация поступает из запроса XACML, то она может быть выражена как полезная нагрузка XML как часть <Content/>
элемент внутри запроса XACML. Затем вы можете использовать селекторы атрибутов и XPath, чтобы получить то, что вас интересует.
НТН. Проверьте и мой блог и блог Axiomatics для большего количества подсказок.