Мета безопасности

Описание

Мета безопасности - регулирует настройку прав безопасности на объекты системы. Можно разделить на статическую и динамическую безопасность:

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

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

Настройка динамической безопасности производится в файле deploy.json, а также в файле acl/resources-and-roles.yml. Статическая безопасность задается только в файле acl/resources-and-roles.yml.

Правила формирования идентификаторов ресурсов

  • узел навигации - n:::namespace@code
  • класс - c:::classname@namespace
  • объект - i:::classname@namespace@id
  • атрибут - a:::classname@namespace.propertyname
  • геомета:
    • узел навигации: geonav:::код узла@namespace
    • слой: geolayer:::код слоя@namespace
    • данные: geodata:::код слоя@namespace@индекс запроса
  • пути (модулей):
    • модуль portal: sys:::url:portal/*
    • модуль geomap: sys:::url:geomap/*

Типы прав

Чтение read

read - это право на просмотр информации по объектам класса. Задает разрешение просматривать объекты класса только для чтения и запрещает их создание/редактирование.

- id: Users
    name: Обычные пользователи
    permissions:
      n:::ns@navigationName:
        - read
...

Запись write

write - это право на создание объектов класса. Задает разрешение на создание новых объектов класса, но запрещает редактирование существующих.

- id: Users
    name: Обычные пользователи
    permissions:
      n:::ns@navigationName:
        - write
...

Использование use

use - это право на создание объектов класса. Задает разрешение на создание объектов класса, и использование объектов класса в ссылках и коллекциях.

Без use - ссылки тоже отображаются в коллекции. Если есть read, но нет use, то нельзя выбрать объект и поместить его в коллекцию.

- id: Users
    name: Обычные пользователи
    permissions:
      n:::ns@navigationName:
        - use
...

Удаление delete

delete - это право на удаление объектов класса.

Полный доступ full

full - это право на полный доступ к объектам класса.

Динамическая безопасность

"PROJECT_BENEFITIAR": {
"resource":

{ "id": "pm::project" }
,
"attribute": "stakeholders.id"
}

Если у проекта в stakeholders.id есть значение ассоциированное с текущим пользователем (настроено подтягивание организации как глобальной роли пользователя), то стоит учитывать текущего пользователя PROJECT_BENEFITIAR и проверить права на ресурс pm:project - эти права и будут правами на проект.

pm:project - это некий виртуальный ресурс безопасности. Необходимо абстрагировать настройки доступа от проверяемого объекта для разных ролей, можно разные ресурсы указать на один класс и наоборот.

Если ресурс не указать, то будут проверяться права на класс объекта. Тогда эту роль можно использовать как статическую, то есть выдавать статические права динамически.

Групповая динамическая безопасность

"roleMap": {
  "organization@project-management": {
    "ORGANIZATION_STAFF": {
      "caption": "Сотрудник организации",
        "resource": {
          "id": "pm::organization",
          "caption": "Организация"
        },
        "sids": [ // применять роль, если:
          "$employee", // в атрибуте employee связанное с user значение (user это сотрудник)
          // ИЛИ
          "admin", // user это admin (здесь роль, учетная запись или идентификаторы связанные с user)
          // ИЛИ
          [
             "$boss", // в атрибуте $boss связанное с user значение (user это руководитель)
             // И
             "supervisor" // user это supervisor (роль или учетная запись)
          ]
        ],
        "conditions": {"eq": ["$state", "active"]}, // применять роль только для активных организаций
        "attribute": "employee.id", // добавляется к sids
      }
    }
     }

При указании sids каждый уровень вложенности массивов значений меняет вид операции И/ИЛИ. На первом уровне применяется ИЛИ.

Определение ролей пользователя

  1. Регистрируем пользователя с полным административным доступом - admin.
  2. Под admin в registry в разделе Безопасность.Подразделения заводим иерархию подразделений (код подразделения = идентификатор безопасности).
  3. Регистрируем пользователя без прав - user.
  4. Под админ в registry в разделе Безопасность.Сотрудники заводим Сотрудника, указываем у него в атрибуте Пользователь пользователя без прав. Привязываем сотрудника к самому нижестоящему подразделению.
  5. Заходим под user - прав нет ни на что.
  6. Заходим под admin и даем роли (соответствующей самому вышестоящему подразделению) права на произвольные классы и узлы навигации.
  7. Заходим под user - есть доступ к объектам, к которым есть доступ у подразделения.
  8. Аналогично проверяем применение разрешений по всей иерархии подразделений.

Пример настройки в deploy.json

"actualAclProvider":{
        "module": "core/impl/access/aclmongo",
        "initMethod": "init",
        "initLevel": 1,
        "options":{
          "dataSource": "ion://Db"
        }
      },
      "roleAccessManager": {
        "module": "core/impl/access/amAccessManager",
        "initMethod": "init",
        "initLevel": 1,
        "options": {
          "dataSource": "ion://Db"
        }
      },
      "aclProvider": {
        "module": "core/impl/access/aclMetaMap",
        "options":{
          "dataRepo": "ion://dataRepo",
          "acl": "ion://actualAclProvider",
          "accessManager": "ion://roleAccessManager",
          "map": {
            "employee@develop-and-test": {
              "isEntry": true,
              "sidAttribute": "uid",
              "jumps": ["department"]
            },
            "department@develop-and-test": {
              "sidAttribute": "code",
              "jumps": ["superior"]
            }
          }
        }
      }

Модель отображения атрибутов и объектов в соответствии с заданными правами

Есть класс [Проекты], в нем содержится атрибут с типом «Коллекция» - [Мероприятия]. Если для класса [Мероприятия] нет прав на чтение, то атрибут этого класса не показывается на форме класса [Проекты].

Если для класса есть динамическая безопасность - то независимо есть или нет права на чтение класса [Мероприятия] - атрибут на форме класса [Проекты] будет показан, но сами объекты мероприятий будут показаны только если на них есть права.

NB: Для отображения атрибута и объектов необходимо задавать как статическую, так и динамическую безопасность на класс по ссылке атрибута.

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