Скрипт определения права доступа пользователя к объекту

Описание скрипта

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

Место настройки скрипта

Форма добавления роли пользователей, см. Роли пользователей.

Когда выполняется скрипт

  1. При проверке прав доступа: в момент открытия формы добавления и в момент сохранения объекта, учитывая заполнение значений атрибутов на форме добавления.

    При открытии карточки права вычисляются для всех передаваемых в веб-интерфейс объектов, а также для кнопок добавления объектов.

  2. При определении принадлежности пользователя к данной роли.
    Пример, в рамках определения принадлежности пользователя к профилю при проверке прав доступа.

Результат выполнения скрипта

  • Возвращает "true" (верно) — пользователю присваивается указанная роль.
  • Возвращает "false" (ложь) — роль не присваивается.

Переменные и их значения

Глобальные переменные:

  • user — пользователь, инициализировавший событие. Является объектом класса "Сотрудник" (employee).

    Если событие инициализировал суперпользователь, то user=null.

    Если событие инициализировано скриптом (скриптовое действие по событию, скрипт на вход в статус), то переменная user берется из контекста инициировавшего его скрипта.

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

  • ip — ip-адрес рабочего места пользователя user. Если действие выполняется автоматически системой (а не пользователем), то переменная не определяется.
  • appVersion — версия приложения.
  • api — используется для обращения к методам api, например api.utils, api.ldap, api.timing, см. Методы API;
  • modules — используется для обращения к скриптовому модулю и конкретному методу, определенному в нем, с помощью конструкции: modules.{код модуля}.{имя метода}({параметры метода}...), см. Скрипт текста модуля;
  • logger — используется для отладки скриптов и позволяет вывести в лог на указанный уровень переданную строку, см. Отладочные сообщения.
  • utils — синоним api.utils.

Переменные контекста:

  • subject — объект, относительно которого проверяются права. Используется при создании относительной пользовательской роли. Наличие данной роли у пользователя вычисляется относительно отдельного объекта указанного класса. Значение subject может быть "null", если проверяются права на добавление объекта. Состояние изменяется в процессе выполнения действий.

    В случае, когда уточнение права происходит для комментария (файла), в качестве subject передается объект источник комментария (файла).

  • initialValues — значение атрибута на форме добавления объекта. Используется при проверке прав на добавление объекта. Позволяет выполнять проверку прав в момент открытия формы добавления и в момент сохранения объекта, учитывая заполнение значений атрибутов на форме добавления:

    • при открытии формы добавления объекта содержит значения атрибутов явно переданных на форму добавления;
    • при сохранении формы добавления объекта также содержит значения атрибутов, введенные на форме добавления;
    • при выборе объекта в списке в скрипте пользовательской роли initialValues включает параметр #checkingForMassOperation = true. Параметр означает, что проверка выполняется для массовых операций в списке объектов.
    • в других случаях значение переменной не определено (null).
  • oldSubject — объект, до выполнения редактирования, для которого проверяется право. Во всех случаях, кроме непосредственно редактирования, данная переменная равна null. Состояние зафиксировано на момент начала выполнения действий.

    При использовании переменной значение атрибутов типа "Обратная ссылка" всегда будет равно null.

  • sourceObject — объект, относительно которого проверяется право, в данном скрипте sourceObject = null.
  • cardObject — объект, из карточки которого было инициировано действие.

    Переменная не поддерживается в мобильном приложении.

    Если действие инициировано НЕ из карточки объекта, то cardObject = null.

  • origin — тип месторасположения.

    Переменная не поддерживается в мобильном приложении.

    Возможные значения:

    • readForm (форма для чтения) — скрипт вычисляется на карточке объекта, на сложной форме добавления и редактирования связей (расширенная форма редактирования), в списке по ссылке на отдельной странице, в списке на странице результатов поиска, при нажатии на кнопку вызова действий в строке списка;
    • addForm — скрипт вычисляется на форме добавления, на быстрой форме добавления;
    • editForm — скрипт вычисляется на форме редактирования объекта, на форме редактирования атрибутов, вызванной из контента "Параметры объекта", на форме редактирования в ячейке списка, на форме быстрого редактирования, на форме массового редактирования, на форме смены типа; на форме смены ответственного, на форме смены привязки (переклассификации), на форме работы с массовостью (управление массовостью запроса), на форме смены статуса, на форме перемещения (смены родителя);
    • addFormComment/editFormComment — скрипт вычисляется на форме добавления/редактирования комментария;
    • addFormFile/editFormFile — скрипт вычисляется на форме добавления/редактирования файла.

Пример скрипта

1. Скрипт проверяет соответствие текущего пользователя с указанным в атрибуте head отдела текущего пользователя.

Copy
if(!user)
{
return false
}
def userOUhead = subject?.parent?.head
return utils.equal(user, userOUhead)

2. Скрипт проверяет услуги из атрибута правила (через subject) или из значения атрибута на форме добавления (через initialValues). Значением initialValues для атрибутов ссылочного типа является UUID объекта/объектов.

Copy
def services = []
if (initialValues.get('listServices'))
{
    services.addAll(initialValues.get('listServices'))
}
else if (subject)
{
    services.addAll(subject.listServices.UUID)
}
return modules.ruleUtils.methodForValidation(services)