Система прав

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

  1. Привилегия - основная составляющая системы прав. Код привилегии, обычно, содержит осмысленный идентификатор начинающийся с приставки Is. Например, IsLoginAsTester (привилегия дающая права на вход под другим пользователем)

  2. Набор привилегий объединяется в Роль. Например, Администратор или Оператор

  3. Дополнительно 3 привилегии вынесены отдельно для более гибкой настройки прав работы с документами (Чтение, Запись, Блокировка). Важно понимать, что по существу они являются теми же привилегиями. Набор этих привилегий в контексте групп периодов и ролей документов называется Пропуск.

Роль назначается для пользователя, при этом можно выбрать следующие ограничения для действия Роли:

  1. Ограничение по периоду или группе периодов

  2. Ограничение по объекту учета или группе объектов учета

  3. Ограничение по документу или группе документов

Если роль назначена без ограничений - то все привилегии будут срабатывать всегда

Пример работы привилегий:

У пользователя назначена роль Admin с ограничением для организации "Управляющая компания". В этом случае привилегии вида: IsLoginAsTester (вход под другим пользователем) будет доступна только при выборе пользователей входящих в эту организацию.

Настройка привилегий

Каждый модуль системы может объявлять дополнительные привилегии. Например, модуль Местоположение добавляет в систему привилегию IsLocationTunner.

Для объявления новой привилегии нужно добавить в конфигурационный файл модуля запись в раздел permissions

 "permissions" : [
       "IsLocationTunner"
  ]

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

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

"permissionsModels":{
     "IsLocationTunner":["city","region","country"]
 }

Данная запись дает пользователю с привилегией IsLocationTunner полный контроль над перечисленными справочниками.

Все добавленные модулями привилегии автоматически добавляются в роль Admin. Установка привилегии у других ролей настраивается вручную.

Работа с правами

Система предоставляет следующие механизмы работы с правами:

Серверные middleware.

var LIB = require(__base+'lib/helpers/lib.js');
var HP = LIB.Permits; 

// Далее в коде
router.get('/loginas',  LIB.Require(['CodeUser']), HP.UserTaskAccess("IsLoginAsTester"), function(req,res,next){})

В данном примере первый middleware обеспечивает работоспособность функции только при условии, что передан код пользователя под которым вы собираетесь зайти, а вторая middleware делает проверку прав, в контексте пользователя.

Полный список доступных middleware

HP.TaskAccess("IsRequestApprover"); // проверка наличия привилегии
HP.UserTaskAccess("IsLoginAsTester"); // проверка наличия привилегии в контексте пользователя
HP.ModelAccessM(); // проверка на доступность редактирования справочников название модели находится в параметре model
HP.DocAccess(); // проверка прав на работу с документом (пропуск)

Проверка прав на клиенте

Система предоставляет custom binding Permit, который делает область экрана невидимой для пользователя при отсутствии нужных прав. Это используется обычно, чтобы скрыть элементы интерфейса (кнопки, таблицы ...).

Permit:{Id:"IsDocPermissionAssigner",CodeUser:ModelTableEdit.LoadedModel().CodeUser(),Type:"UserTask"}

В данном случае custom binding скрывает в интерфейсе управления пользователей раздел управление пропусками

Кроме выше перечисленных средств модуль управления правами предоставляет возможность напрямую спрашивать о наличии той или иной привилегии у пользователя. Функционал проверки прав реализован в файле check.js, который подключается и на сервере и на клиенте, поэтому все нижеописанные методы можно вызывать как на сервере так и на клиенте.

Доступные вызовы на клиенте (можно проверять работу - в консоли разработчика - F12):

PermChecker.ModelAccess("название_модели") // доступ к справочникам
PermChecker.CheckDocAccess(Action, Context); // Проверка на доступность действия по отношению к документу
// для текущего документа контекст можно получить через функцию
CxCtrl.CxPermDoc()
PermChecker.CheckUserPrivelege(CodePrivelege,CodeUser); // наличие привилегии по отношению к указанному пользователю
PermChecker.CheckPrivelege(Action, Context); // проверка наличия привилегии

Получение доступных объектов

В функционал проверки прав, также заложена возможность получения доступных объектов:

PermChecker.AvDoc(); // список доступных документов
PermChecker.AvRole(); // список доступных ролей документов
PermChecker.AvObj(); // список доступных объектов учета
PermChecker.AvObjGrp(); // список доступных групп объектов учета
PermChecker.AvPeriod(); // список доступных периодов
PermChecker.AvPeriodGrp(); // список доступных групп периодов

Last updated