# Система прав

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

1. **Привилегия** - основная составляющая системы прав. Код привилегии, обычно, содержит осмысленный идентификатор начинающийся с приставки Is. Например, IsLoginAsTester (привилегия дающая права на вход под другим пользователем)
2. Набор привилегий объединяется в **Роль**. Например, Администратор или Оператор
3. Дополнительно 3 привилегии вынесены отдельно для более гибкой настройки прав работы с документами (Чтение, Запись, Блокировка). Важно понимать, что по существу они являются теми же привилегиями. Набор этих привилегий в контексте групп периодов и ролей документов называется **Пропуск**.

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

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

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

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

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

## Настройка привилегий <a href="#nastroika-privilegii" id="nastroika-privilegii"></a>

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

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

```javascript
 "permissions" : [
       "IsLocationTunner"
  ]
```

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

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

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

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

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

## Работа с правами <a href="#rabota-s-pravami" id="rabota-s-pravami"></a>

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

### Серверные middleware. <a href="#servernye-middleware" id="servernye-middleware"></a>

```javascript
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

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

### Проверка прав на клиенте <a href="#proverka-prav-na-kliente" id="proverka-prav-na-kliente"></a>

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

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

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

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

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

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

### Получение доступных объектов <a href="#poluchenie-dostupnykh-obektov" id="poluchenie-dostupnykh-obektov"></a>

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

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