Хранение файла XACML в JSON с использованием MongoDB для Authzforce - PullRequest
0 голосов
/ 27 июня 2018

Я хотел бы реализовать механизм 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 политики, таким как this , он создаст файл 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, например this , но я не уверен, как его реализовать нормально.

Ответы [ 2 ]

0 голосов
/ 07 июля 2018

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

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

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

0 голосов
/ 28 июня 2018

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

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

{
    "policy":"the xml policy contents escaped as valid json value or in base64"
}
...