Хранение файла XACML в JSON с использованием MongoDB для Authzforce

Я хотел бы реализовать механизм PDP, используя файл jar authzforce-ce-core-pdp-engine, как вы упомянули в README, но за исключением файлов политики в XML должен быть динамическим. Основная идея аналогична системе общего доступа к файлам, поскольку один пользователь может совместно использовать несколько файлов для другого пользователя, при этом каждый файл может иметь различную политику. Я думал о том, чтобы хранить файлы политик в какой-то БД, такой как MySQL или MongoDB, и PDP будет ссылаться на них и принимать решение о предоставлении или отказе в доступе на основе запроса.

Я обнаружил, что ядро ​​pdp поддерживает MongoDB, как упомянуто здесь.

Вот мой файл конфигурации pdp:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Testing parameter 'maxPolicySetRefDepth' -->
<pdp xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://authzforce.github.io/core/xmlns/pdp/6.0" xmlns:ext="http://authzforce.github.io/core/xmlns/test/3" version="6.0.0">
   <refPolicyProvider id="refPolicyProvider" xsi:type="ext:MongoDBBasedPolicyProvider" serverHost="localhost" serverPort="27017" dbName="testXACML" collectionName="policies" />
   <rootPolicyProvider id="rootPolicyProvider" xsi:type="StaticRefBasedRootPolicyProvider">
      <policyRef>root-rbac-policyset</policyRef>
   </rootPolicyProvider>
</pdp>

Итак, теперь вопрос в том, как я могу хранить XML-файлы политики, поскольку они должны храниться в JSON с MongoDB? Я пытался преобразовать XML в JSON, используя зависимость JSON maven, но у меня проблема с преобразованием обратно в XML. Например, с таким XML-файлом политики он создаст JSON-файл примерно так:

{"Policy": {
    "xmlns": "urn:oasis:names:tc:xacml:3.0:core:schema:wd-17",
    "Target": "",
    "Description": "Policy for Conformance Test IIA001.",
    "Version": 1,
    "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance",
    "RuleCombiningAlgId": "urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:deny-overrides",
    "Rule": {
        "Target": {"AnyOf": [
            {"AllOf": {"Match": {
                "AttributeValue": {
                    "DataType": "http://www.w3.org/2001/XMLSchema#string",
                    "content": "Julius Hibbert"
                },
                "AttributeDesignator": {
                    "Category": "urn:oasis:names:tc:xacml:1.0:subject-category:access-subject",
                    "AttributeId": "urn:oasis:names:tc:xacml:1.0:subject:subject-id",
                    "MustBePresent": false,
                    "DataType": "http://www.w3.org/2001/XMLSchema#string"
                },
                "MatchId": "urn:oasis:names:tc:xacml:1.0:function:string-equal"
            }}},
            {"AllOf": {"Match": {
                "AttributeValue": {
                    "DataType": "http://www.w3.org/2001/XMLSchema#anyURI",
                    "content": "http://medico.com/record/patient/BartSimpson"
                },
                "AttributeDesignator": {
                    "Category": "urn:oasis:names:tc:xacml:3.0:attribute-category:resource",
                    "AttributeId": "urn:oasis:names:tc:xacml:1.0:resource:resource-id",
                    "MustBePresent": false,
                    "DataType": "http://www.w3.org/2001/XMLSchema#anyURI"
                },
                "MatchId": "urn:oasis:names:tc:xacml:1.0:function:anyURI-equal"
            }}},
            {"AllOf": [
                {"Match": {
                    "AttributeValue": {
                        "DataType": "http://www.w3.org/2001/XMLSchema#string",
                        "content": "read"
                    },
                    "AttributeDesignator": {
                        "Category": "urn:oasis:names:tc:xacml:3.0:attribute-category:action",
                        "AttributeId": "urn:oasis:names:tc:xacml:1.0:action:action-id",
                        "MustBePresent": false,
                        "DataType": "http://www.w3.org/2001/XMLSchema#string"
                    },
                    "MatchId": "urn:oasis:names:tc:xacml:1.0:function:string-equal"
                }},
                {"Match": {
                    "AttributeValue": {
                        "DataType": "http://www.w3.org/2001/XMLSchema#string",
                        "content": "write"
                    },
                    "AttributeDesignator": {
                        "Category": "urn:oasis:names:tc:xacml:3.0:attribute-category:action",
                        "AttributeId": "urn:oasis:names:tc:xacml:1.0:action:action-id",
                        "MustBePresent": false,
                        "DataType": "http://www.w3.org/2001/XMLSchema#string"
                    },
                    "MatchId": "urn:oasis:names:tc:xacml:1.0:function:string-equal"
                }}
            ]}
        ]},
        "Description": "Julius Hibbert can read or write Bart Simpson's medical record.",
        "RuleId": "urn:oasis:names:tc:xacml:2.0:conformance-test:IIA1:rule",
        "Effect": "Permit"
    },
    "PolicyId": "urn:oasis:names:tc:xacml:2.0:conformance-test:IIA1:policy"
}}

но когда я пытаюсь преобразовать его обратно в XML, он становится совершенно другим XML-файлом. Итак, как я могу сохранить XML-файл в MongoDB? Также, как гарантировать, что ядро ​​pdp-ядра сможет найти правильную политику для сравнения? Я видел упоминание об адаптере json в README, как это, но я не уверен, как это реализовать нормально.

2 ответа

Решение

Я ответил на этот вопрос на github от AuthzForce. В двух словах, Дэвид в основном прав насчет формата (контент XML хранится в виде строки JSON). Точнее говоря, для провайдера политики AuthzForce MongoDB вы должны хранить политики, как показано частью модульного теста класса setupBeforeClass метод, который заполняет базу данных тестовыми политиками. Вы увидите, что мы используем библиотеку Jongo (используя сопоставление объектов Джексона за занавесом) для отображения PolicyPOJO Java объекты в JSON в коллекции Mongodb. Итак, из класса PolicyPOJO вы можете в значительной степени угадать формат хранения политик в JSON: это объект JSON со следующими полями (пары ключ-значение):

  • "id" (строка): идентификатор политики (Set)
  • "версия" (строка): версия политики (Set)
  • "type" (строка): тип Policy(Set), т. е. "{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}Policy" (соответственно '{urn:oasis:names::tc:xacml:3.0:core:schema:wd-17}PolicySet') для политики XACML 3.0 (соответственно, PolicySet)
  • "content" (строка): фактический XML-документ Policy(Set) в виде строки (простой текст)

Содержимое xml автоматически экранируется библиотекой Java (Jongo/Jackson) для размещения в строке JSON. Но если вы используете другую библиотеку / язык, убедитесь, что это так.

В настоящее время нет формата JSON для политик XACML. Это в настоящее время рассматривается Техническим комитетом OASIS XACML. Бернард Батлер из Технологического института Уотерфорда сделал некоторый первоначальный перевод, который может быть полезен для вас.

Единственный другой вариант, о котором я могу пока подумать, - это создать JSON-оболочку для политик, например:

{
    "policy":"the xml policy contents escaped as valid json value or in base64"
}
Другие вопросы по тегам