Разработка:Управление доступом — различия между версиями

Материал из DOF
Перейти к: навигация, поиск
(Дописано описание прав с учетом всех изменений)
(Правила работы с правами доступа)
 
(не показано 11 промежуточных версий 2 участников)
Строка 6: Строка 6:
 
=== Плагины необходимые для системы управления доступом ===
 
=== Плагины необходимые для системы управления доступом ===
  
[[Разработка:storages/acl | acl ]] - список полномочий. Хранит информацию о том в каком плагине какие полномочия существуют.
+
* [[Разработка:storages/acl | acl ]] - список полномочий. Хранит информацию о том в каком плагине какие полномочия существуют.
[[Разработка:storages/aclwarrants | aclwarrants ]] - Мандаты и доверенности.  
+
* [[Разработка:storages/aclwarrants | aclwarrants ]] - Мандаты и доверенности.  
[[Разработка:storages/aclwarrantagents | aclwarrantagents ]] - Применение доверенностей. Определяет, каким пользователям какие доверенности выданы.
+
* [[Разработка:storages/aclwarrantagents | aclwarrantagents ]] - Применение доверенностей. Определяет, каким пользователям какие доверенности выданы.
  
 
=== Общие правила и требования ===
 
=== Общие правила и требования ===
 
* Сторонние плагины могут зависеть от плагинов прав доступа, а плагины прав доступа не могут зависеть от остальных плагинов, и извлекать информацию из них (за исключением события установки/обновления плагина).
 
* Сторонние плагины могут зависеть от плагинов прав доступа, а плагины прав доступа не могут зависеть от остальных плагинов, и извлекать информацию из них (за исключением события установки/обновления плагина).
* Каждый плагин, предоставляющий права доступа должен реализовывать интерфейс dof_storage_acl_interface
+
* Каждый плагин, предоставляющий права доступа должен описывать права в функции acldefault()
** Список и структура прав доступа описывается в функции acldefault()
 
 
** Формат массива:  
 
** Формат массива:  
 
<pre>
 
<pre>
Строка 25: Строка 24:
 
* Все функции в сторонних плагинах, которые управляют правами доступа должны иметь префикс acl
 
* Все функции в сторонних плагинах, которые управляют правами доступа должны иметь префикс acl
 
* В плагинах типа im и modlib следует для проверки стандартных прав доступа обращаться к плагинам storage.
 
* В плагинах типа im и modlib следует для проверки стандартных прав доступа обращаться к плагинам storage.
 
+
* При построении прав на смену статуса объектов деканата имеет значение лишь то, в какой статус будет осуществлен перевод. Следовательно, необходимо реализовывать только права changestatus:to:СТАТУС.
 
+
** Право changestatus:from:СТАТУС следует устанавливать только для ограничения возможности вывода из спецстатусов.
 +
** Право changestatus без модификаторов, дает право перевода из любого статуса в любой, кроме специальных (для которых объявлено право changestatus:from:Статус). Право changestatus:to:Статус дает право на перевод в целевой статус из любого другого, кроме специальных, для которых объявлено право changestatus:from:Статус.
  
 
=== Как происходит процесс установки прав ===
 
=== Как происходит процесс установки прав ===
 
При установке, обновлении или удалении любого плагина, если он предоставляет права доступа - то в функциях upgrade(), delete(), и install() нужно вызывать функцию save_roles() плагина [[Разработка:storages/acl | acl ]].
 
При установке, обновлении или удалении любого плагина, если он предоставляет права доступа - то в функциях upgrade(), delete(), и install() нужно вызывать функцию save_roles() плагина [[Разработка:storages/acl | acl ]].
 +
 
== Правила работы с правами доступа ==
 
== Правила работы с правами доступа ==
  
 
=== Полномочия (acl) ===
 
=== Полномочия (acl) ===
 
* Полномочия не имеют статусов, поэтому при удалении плагина все полномочия, принадлежащие ему также физически удаляются из таблицы
 
* Полномочия не имеют статусов, поэтому при удалении плагина все полномочия, принадлежащие ему также физически удаляются из таблицы
 
+
* Для хранилищ и рабочих процессов существуют [[ Разработка:storages/acl#.D0.A1.D1.82.D0.B0.D0.BD.D0.B4.D0.B0.D1.80.D1.82.D0.BD.D1.8B.D0.B5_.D0.BF.D0.BE.D0.BB.D0.BD.D0.BE.D0.BC.D0.BE.D1.87.D0.B8.D1.8F_.D0.B4.D0.BB.D1.8F_.D1.85.D1.80.D0.B0.D0.BD.D0.B8.D0.BB.D0.B8.D1.89_.D0.B8_.D1.80.D0.B0.D0.B1.D0.BE.D1.87.D0.B8.D1.85_.D0.BF.D1.80.D0.BE.D1.86.D0.B5.D1.81.D1.81.D0.BE.D0.B2 | стандартные полномочия ]]
==== Стандартные полномочия для хранилищ и рабочих процессов ====
+
* Полномочия проверяются только тем плагином, в котором они содержатся. То есть - из im/persons можно проверять только права im/persons, из storage/persons только права storage/persons. Нельзя проверять из одного плагина права другого плагина.
В каждом плагине storage для определения уровня доступа к объекту следует использовать стандартные обозначения:
 
 
 
* view - право просматривать объект из таблицы
 
* edit - право редактировать объект из таблицы
 
* create - право создавать новый объект в таблице
 
* delete - право удалять объект из таблицы
 
* viewbase - право просматривать сокращенную информацию по объекту (например при просмотре списка записей)
 
* viewextended - право просматривать расширенную информацию по объекту (все поля)
 
* edit:имя_поля - право редактировать отдельное поле
 
* view:имя_поля - право просматривать отдельное поле
 
* changestatus:from:статус - изменять статус с указанного
 
* changestatus:to:статус - изменять статус на указанный
 
* changestatus:all - вообще изменять статус
 
 
 
Также при создании права можно указать отношение, которое указанный пользователь имеет к объекту, на который назначены права.
 
Отношение указывается через прямой слеш "/".  
 
Примеры
 
* 'edit/owner' - право редактировать объект для владельца.
 
* 'changestatus:all/owner' - право на любое изменение статуса для владельца объекта
 
  
 
=== Мандаты и доверенности (warrants) ===
 
=== Мандаты и доверенности (warrants) ===
Строка 60: Строка 42:
 
** Основным способом удаления мандата следует считать перевод записи в статус "archive"
 
** Основным способом удаления мандата следует считать перевод записи в статус "archive"
 
** Все дочерние доверенности и мандаты также перестают действовать
 
** Все дочерние доверенности и мандаты также перестают действовать
** Прекращают действия все применения полномочий ([[Разработка:storage/warrantagents | warrantagents ]]) которые были назначены указанным мандатом.
+
** Прекращают действия все применения полномочий ([[Разработка:storages/aclwarrantagents | aclwarrantagents ]]) которые были назначены указанным мандатом.
 
* При установке прав новым плагином все новые права добавляются к стандартным доверенностям
 
* При установке прав новым плагином все новые права добавляются к стандартным доверенностям
 
* Плагины не могут добавлять свои доверенности при установке
 
* Плагины не могут добавлять свои доверенности при установке
Строка 68: Строка 50:
 
==== Синхронизация ====
 
==== Синхронизация ====
 
Здесь описаны плагины, которые должны синхронизироваться с таблицей доверенностей.  
 
Здесь описаны плагины, которые должны синхронизироваться с таблицей доверенностей.  
* [[Разработка:storage/positions | storage/positions]]
+
* [[Разработка:storages/positions | storage/positions]]
  
 
=== Применение полномочий (warrantagents) ===
 
=== Применение полномочий (warrantagents) ===
Строка 76: Строка 58:
 
==== Синхронизация ====
 
==== Синхронизация ====
 
Здесь описаны плагины, которые должны синхронизироваться с таблицей применения полномочий.  
 
Здесь описаны плагины, которые должны синхронизироваться с таблицей применения полномочий.  
* [[Разработка: storage/appointments | storage/appointments ]]
+
* [[Разработка:storages/appointments | storages/appointments ]]
 +
 
 +
=== Опасные действия и режим работы в обход стандартной логики (datamanager) ===
 +
 
 +
Режим datamanager позволяет админам действовать в обход стандартной логики на свой страх и риск. Такие действия могут понадобиться, например, в случае выполнения ошибочных действий сотрудниками, однако не должны быть доступны обычным пользователям во избежание потери данных или консистентности данных. Чтобы для выполнения этих действий не требовалась модификация напрямую через СУБД, реализован опасный режим.
 +
 
 +
Для перехода в опасный режим персона должна иметь соответствующее право и подтвердить свое согласие с переходом в опасный режим через интерфейс системы.
 +
 
 +
Проверка опасного режима должна осуществляться через реализованный метод is_datamanager(), который проверит и право и согласие. Проверка режима через инструменты прав доступа в настоящий момент является устаревшей и должна быть заменена на использование выше указанного метода.
 +
 
 +
==== Принципы реализации проверок для режима datamanager ====
 +
 
 +
* В обычном режиме пользователю должны быть заблокированы любые изменения, которые могут привести к неочевидному (или не очень очевидному) безвозвратному  уничтожению или порче данных.
 +
Также могут быть заблокированы изменения, которые способны нарушить консистентность и корректность данных.
 +
* По возможности необходимо реализовать более полные и глубокие проверки, например, запрещать не любое изменение даты, а только опасное, вызывающее противоречие и могущее повлечь порчу данных (например, дата старта обучения должна быть не позже даты первого результата обучения, оценки, подписки на элемент учебного плана и т.п.). При недостатке ресурсов предпочитаем полное блокирование изменения поля и полагаемся на режим datamanager, где пользователь может выполнить изменения полностью на свой страх и риск, самостоятельно проверив непротиворечивость данных.
 +
* Режим datamanager разрешает любое редактирование. Опасные ситуации, которые могут привести к порче данных, должны быть доступны только в этом режиме и описаны.
 +
* datamanage - это право, предназначенное только для игнорирования некоторых (добавленных с целью сохранения консистентности) валидаций данных, она не добавляет и не убирает никаких прав, если их нет, для выполнения опасного действия помимо собственно нужно иметь право для исполнения этого действия и подтвержденное согласие работы в опасном режиме
 +
 
 +
При принятии технических решений полная блокировка потенциально опасного действия предпочтительна непредсказуемому каскадному обновлению данных после этого действия. Например, если изменение даты начала подписки на программу может привести к пересчету истории обучения и ее порче, предпочитаем заблокировать такое изменение (пока пользователь руками не поправит все объекты, вступающие в противоречие с изменением), а не выполнять в фоне опасное каскадное действие.
 +
 
 +
 
  
 
[[Категория:Разработка]]
 
[[Категория:Разработка]]
 
[[Категория:Управление доступом]]
 
[[Категория:Управление доступом]]

Текущая версия на 13:29, 25 апреля 2024

Управление доступом

На этой странице содержится вся основная информация по управлению доступом. "Электронный Деканат" имеет собственную систему полномочий, которая дополняет систему полномочий moodle, и позволяет реализовать более гибкое управление правами.

Общая информация

Плагины необходимые для системы управления доступом

  • acl - список полномочий. Хранит информацию о том в каком плагине какие полномочия существуют.
  • aclwarrants - Мандаты и доверенности.
  • aclwarrantagents - Применение доверенностей. Определяет, каким пользователям какие доверенности выданы.

Общие правила и требования

  • Сторонние плагины могут зависеть от плагинов прав доступа, а плагины прав доступа не могут зависеть от остальных плагинов, и извлекать информацию из них (за исключением события установки/обновления плагина).
  • Каждый плагин, предоставляющий права доступа должен описывать права в функции acldefault()
    • Формат массива:
array(
    'view' => array('teacher', 'manager'),
    'edit' => array('manager')
);

В качестве ключей указывается то право, которое назначается, а значением служит массив ролей, которые получают это право. Список стандартных ролей можно посмотреть в плагине aclwarrants

  • Все плагины, отвечающие за работу с полномочиями имеют префикс acl.
  • Все функции в сторонних плагинах, которые управляют правами доступа должны иметь префикс acl
  • В плагинах типа im и modlib следует для проверки стандартных прав доступа обращаться к плагинам storage.
  • При построении прав на смену статуса объектов деканата имеет значение лишь то, в какой статус будет осуществлен перевод. Следовательно, необходимо реализовывать только права changestatus:to:СТАТУС.
    • Право changestatus:from:СТАТУС следует устанавливать только для ограничения возможности вывода из спецстатусов.
    • Право changestatus без модификаторов, дает право перевода из любого статуса в любой, кроме специальных (для которых объявлено право changestatus:from:Статус). Право changestatus:to:Статус дает право на перевод в целевой статус из любого другого, кроме специальных, для которых объявлено право changestatus:from:Статус.

Как происходит процесс установки прав

При установке, обновлении или удалении любого плагина, если он предоставляет права доступа - то в функциях upgrade(), delete(), и install() нужно вызывать функцию save_roles() плагина acl .

Правила работы с правами доступа

Полномочия (acl)

  • Полномочия не имеют статусов, поэтому при удалении плагина все полномочия, принадлежащие ему также физически удаляются из таблицы
  • Для хранилищ и рабочих процессов существуют стандартные полномочия
  • Полномочия проверяются только тем плагином, в котором они содержатся. То есть - из im/persons можно проверять только права im/persons, из storage/persons только права storage/persons. Нельзя проверять из одного плагина права другого плагина.

Мандаты и доверенности (warrants)

  • Действия при удалении мандата или доверенности
    • Основным способом удаления мандата следует считать перевод записи в статус "archive"
    • Все дочерние доверенности и мандаты также перестают действовать
    • Прекращают действия все применения полномочий ( aclwarrantagents ) которые были назначены указанным мандатом.
  • При установке прав новым плагином все новые права добавляются к стандартным доверенностям
  • Плагины не могут добавлять свои доверенности при установке
  • Стандартные доверенности не могут быть назначены пользователям
  • Если запрещается наследование для доверенности, которую раньше можно было наследовать - то старые дочерние доверенности продолжают свое действие, но новые создать нельзя

Синхронизация

Здесь описаны плагины, которые должны синхронизироваться с таблицей доверенностей.

Применение полномочий (warrantagents)

  • При прекращении действия доверенности, применение полномочия прекращает действовать (переводится в статус archive)
  • При истечении срока действия применение полномочия переводится в статус archive

Синхронизация

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

Опасные действия и режим работы в обход стандартной логики (datamanager)

Режим datamanager позволяет админам действовать в обход стандартной логики на свой страх и риск. Такие действия могут понадобиться, например, в случае выполнения ошибочных действий сотрудниками, однако не должны быть доступны обычным пользователям во избежание потери данных или консистентности данных. Чтобы для выполнения этих действий не требовалась модификация напрямую через СУБД, реализован опасный режим.

Для перехода в опасный режим персона должна иметь соответствующее право и подтвердить свое согласие с переходом в опасный режим через интерфейс системы.

Проверка опасного режима должна осуществляться через реализованный метод is_datamanager(), который проверит и право и согласие. Проверка режима через инструменты прав доступа в настоящий момент является устаревшей и должна быть заменена на использование выше указанного метода.

Принципы реализации проверок для режима datamanager

  • В обычном режиме пользователю должны быть заблокированы любые изменения, которые могут привести к неочевидному (или не очень очевидному) безвозвратному уничтожению или порче данных.

Также могут быть заблокированы изменения, которые способны нарушить консистентность и корректность данных.

  • По возможности необходимо реализовать более полные и глубокие проверки, например, запрещать не любое изменение даты, а только опасное, вызывающее противоречие и могущее повлечь порчу данных (например, дата старта обучения должна быть не позже даты первого результата обучения, оценки, подписки на элемент учебного плана и т.п.). При недостатке ресурсов предпочитаем полное блокирование изменения поля и полагаемся на режим datamanager, где пользователь может выполнить изменения полностью на свой страх и риск, самостоятельно проверив непротиворечивость данных.
  • Режим datamanager разрешает любое редактирование. Опасные ситуации, которые могут привести к порче данных, должны быть доступны только в этом режиме и описаны.
  • datamanage - это право, предназначенное только для игнорирования некоторых (добавленных с целью сохранения консистентности) валидаций данных, она не добавляет и не убирает никаких прав, если их нет, для выполнения опасного действия помимо собственно нужно иметь право для исполнения этого действия и подтвержденное согласие работы в опасном режиме

При принятии технических решений полная блокировка потенциально опасного действия предпочтительна непредсказуемому каскадному обновлению данных после этого действия. Например, если изменение даты начала подписки на программу может привести к пересчету истории обучения и ее порче, предпочитаем заблокировать такое изменение (пока пользователь руками не поправит все объекты, вступающие в противоречие с изменением), а не выполнять в фоне опасное каскадное действие.