Скрипт уточнения права доступа

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

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

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

В матрице прав, см. Настройка матрицы прав.

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

При проверке наличия права в момент совершения указанного действия с объектом.

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

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

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

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

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

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

  • subject — объект, относительно которого проверяется право (скрипт уточнения прав добавлен в матрице прав класса этого объекта).
  • oldSubject — объект, для которого проверяется право, до выполнения редактирования. Не null, когда subject не null. Если происходит изменение атрибутов, то в oldSubject хранятся значения до редактирования. Переменная может быть использована только для пользовательских атрибутов.

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

  • sourceObject — объект, относительно которого проверяется право (запрос, соглашение, сотрудник, отдел, команда и т.д).

    При редактировании объекта в этой переменной null.

    При проверке на право добавления объекта, в скрипте, в переменной sourceObject будет находиться объект, на карточке которого проверялась возможность добавления объекта. В том числе, при добавлении объекта из списков, расположенных на карточке компании, в переменной sourceObject будет лежать объект "компания"(root$101).

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

    Известные исключения:

    • При добавлении объекта по кнопке добавления из верхнего меню sourceObject = null при добавлении объекта с любой карточки.
    • При добавлении объекта класса "Запрос" (serviceCall) по общей кнопке добавления из верхнего меню sourceObject = "объект сотрудник" (employee$...) при добавлении объекта с любой карточки.
    • При добавлении объекта из быстрой формы добавления, вызванной с быстрой формы добавления sourceObject = UUID временного объекта с родительской формы.
    • При проверке прав комментариев и файлов sourceObject = null. В этом случае объект, к которому добавляется комментарий или файл, находится в subject.
  • initialValues — набор значений, которые будут доступны на форме добавления объекта (в том числе форме добавления, вызванной с другой формы). Исходя из initialValues скрипт вернет true или false (есть право или нет).

    В матрице прав нужно использовать следующий механизм получения данных из initialValues: initialValues.get('PropertyCode')

    При выборе объекта в списке в скрипте уточнения права на редактирование атрибутов initialValues содержит только параметр #checkingForMassOperation = true. Параметр означает, что проверка выполняется для массовых операций в списке объектов.

  • process — код текущего процесса с объектом. Не null, если происходит изменение объекта (сохранение формы). При сохранении изменений заполняется кодом текущего запущенного процесса.

    Возможные значения: 'AddObject' (в момент сохранения формы добавления объекта), 'EditObject' (в момент сохранения формы редактирования объекта) и 'DeleteObject'' (в момент подтверждения удаления объекта).

    Пример использования переменной — скрипт для маркера прав "Добавление объекта", определяющий право добавления файла только на форме добавления объекта:

    if (oldSubject==null) 
    {return true}
    else
    {
    if (process=='AddObject') 
    {return true}
    else
    {return false} 
    }
  • cardObject — объект, карточка которого открывается. Если действие инициировано НЕ из карточки объекта, то cardObject = null.

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

    Переменную cardObject использовать не рекомендуется.

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

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

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

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

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

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

// Типы объектов(fqn), из которых можно добавить запрос. Можно указать сотрудников, отделы, команды.
def ACCEPTED_TYPES= ['employee$management','employee$ITeng'];
if(!sourceObject)
{
return true
}
return ACCEPTED_TYPES.contains(sourceObject.metaClass.toString())

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

//ПАРАМЕТРЫ------------------------------------------------------------
//Коды статусов запроса. 
//Когда запрос будет находиться в одном из этих статусов, скрипт будет возвращать true (давать права).
def STATES = ['registered','closed']
//ОСНОВНОЙ БЛОК--------------------------------------------------------
return (subject == null && STATES.contains('registered')) || (subject != null && STATES.contains(subject.state))

3. Скрипт для маркера "Редактирование комментариев" матрицы прав, дающий право редактировать созданный комментарий только в течении какого-то времени.

// количество секунд, в течении которых комментарий будет доступен для редактирования
def ALLOWED_TIME_IN_SECONDS = 2 * 60 // 2 минуты = 2 * 60 секунд
//ОСНОВНОЙ БЛОК--------------------------------------------------------
return System.currentTimeMillis() - oldSubject.creationDate.time < ALLOWED_TIME_IN_SECONDS * 1000