Хранение файла 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-файлом политики, например 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 может найти правильную политику для сравнения? Я видел, что в README упоминается об адаптере json, например this, но я не уверен, как это реализовать в обычном режиме.


person Ihsan Haikal    schedule 27.06.2018    source источник
comment
Не могли бы вы принять ответ?   -  person cdan    schedule 17.08.2018


Ответы (2)


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

  • "id" (строка): ID политики (Set)
  • "версия" (строка): версия Политики (Установить)
  • "type" (строка): тип политики (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-документ политики (Set) в виде строки (простой текст)

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

person cdan    schedule 06.07.2018

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

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

{
    "policy":"the xml policy contents escaped as valid json value or in base64"
}
person David Brossard    schedule 28.06.2018