Security
Security — системный модуль, задающий модель управления доступом: роли пользователей, назначение ролей, права на свойства, действия, группы свойств и элементы навигатора, настройки форм и клиента по ролям, ограничения памяти клиента и форму поиска по навигатору. Он лежит в основе управленческой статьи Политика безопасности, интерфейс ролей и доступа которой построен на объявленных здесь классах, свойствах и формах. Подключается через REQUIRE Security (System, SystemEvents, Email и Utils тянутся автоматически как его зависимости).
Роли
Роль объединяет набор прав и настроек, которые затем применяются к назначенным ей пользователям.
| Класс / свойство | Что это |
|---|---|
UserRole | класс роли |
name[UserRole] | имя роли (ISTRING[100]) |
sid[UserRole] | код роли (STRING[30]), устойчивый идентификатор для поиска роли |
userRoleSID[STRING] | роль с указанным sid |
disableRole[UserRole] | признак отключения прав роли без её снятия с пользователей |
copy[UserRole, UserRole] | абстрактное действие, копирующее настройки одной роли в другую (расширяется каждым блоком настроек ниже); базовая реализация задаёт имя и код целевой роли как значения исходной с суффиксом _copy |
copy[UserRole] | создаёт новую роль, наполняет её через copy[UserRole, UserRole] и активирует на форме securityPolicy |
Роль нельзя удалить, пока она назначена хотя бы одному пользователю (CONSTRAINT на DROPPED).
Назначение ролей
У пользователя есть одна главная роль и любое число дополнительных; итоговая принадлежность объединяет обе.
| Свойство | Что возвращает |
|---|---|
mainRole[User] | главная роль пользователя |
nameMainRole[User] / sidMainRole[CustomUser] | имя / код главной роли |
currentUserMainRoleName[] | имя главной роли текущего пользователя |
overIn[User, UserRole] | абстрактный признак принадлежности; базовая реализация добавляет главную роль (mainRole(user) == role) |
in[CustomUser, UserRole] | явное назначение дополнительной роли |
has[User, UserRole] | итоговая принадлежность — in[CustomUser, UserRole] или overIn[User, UserRole] (материализованная) |
userRoles[User] | имена всех ролей пользователя через запятую, по порядку имени |
firstRole[User] | роль с наименьшим номером, отличная от default, иначе роль default |
rolesCount[User] | число ролей пользователя |
Системные роли
createSystemUserRoles[] создаёт четыре встроенные роли, если их нет, определяя их по sid:
sid | Имя | Начальные права |
|---|---|---|
admin | Администратор | показ расширенного описания; разрешение на папку навигатора System.root и права просмотра / изменения / редактирования объекта на группу свойств System_root |
readonly | Только чтение | запрет права изменения на группу свойств System_root |
default | По умолчанию | без начальных прав |
selfRegister | Самостоятельная регистрация | запрет на System.root, разрешение на папку Authentication.account |
Назначение привязано к событиям пользователя: при создании пользователя (SETCHANGED на User) назначается роль default, а при логине admin — ещё и роль admin; при самостоятельной регистрации (onUserRegister) назначается роль selfRegister.
Права
Доступ выражается перечислимым классом Permission со значениями permit, forbid, default. Право хранится по роли на трёх видах целей — группа свойств (PropertyGroup), отдельное действие или свойство (ActionOrProperty) и элемент навигатора (NavigatorElement) — и наследуется вниз по их иерархиям родителей.
Хранимое значение — dataPermission…[UserRole, …]; итоговое значение permission…[UserRole, …] равно хранимому, а при его отсутствии — nearestParentPermission…, праву ближайшего предка в дереве групп / элементов, у которого право задано (GROUP LAST … ORDER DESC level). captionPermission… — отображаемое право (по умолчанию Permission.default); foregroundPermission… гасит унаследованные ячейки, а backgroundPermission… помечает родителя, у потомков которого право отличается.
Доступ к свойствам делится на четыре типа прав, порождаемых метакодом @initPropertyPermission как для группы свойств, так и для действия или свойства:
| Тип | Подпись | Что определяет |
|---|---|---|
view | Просмотр | отображается ли свойство |
change | Изменение | можно ли изменить значение свойства |
editObjects | Редактирование объекта | можно ли перейти к объекту, выступающему значением свойства |
groupChange | Групповое изменение | можно ли изменить свойство для группы объектов |
Каждый тип даёт параллельное семейство свойств, например dataPermissionView[UserRole, PropertyGroup], permissionView[UserRole, ActionOrProperty], captionPermissionView[UserRole, ActionOrProperty]. При более чем 100 изменениях в одной транзакции сбрасывается кеш политики безопасности роли вместо обновления каждой записи по отдельности.
Доступ к навигатору использует ту же модель с единственным правом (dataPermission[UserRole, NavigatorElement], permission[UserRole, NavigatorElement], captionPermission[UserRole, NavigatorElement] с подписью Доступ). Итоговый доступ по пользователю — permit[User, NavigatorElement]: элемент разрешён, когда его разрешает какая-либо включённая роль пользователя или когда его не запрещает ни одна включённая роль.
Настройки форм и клиента
Эти признаки задаются по роли и объединяются по ролям пользователя.
| Свойство | Что делает |
|---|---|
forbidDuplicateForms[UserRole] | открывать единственный экземпляр уже открытой формы вместо нового окна |
dataForbidDuplicateForms[CustomUser] | то же ограничение, заданное для отдельного пользователя |
autoReconnectOnConnectionLost[UserRole] | автоматически переподключать клиент после потери связи |
showDetailedInfo[UserRole] | показывать всплывающее расширенное описание свойств и элементов |
maximizeDefaultForms[UserRole] | открывать клиент на весь экран (с скрытым навигатором) при запуске |
Формы по умолчанию
defaultNumber[UserRole, NavigatorElement] задаёт номер порядка при запуске для элемента навигатора по роли; defaultNumber[User, NavigatorElement] берёт минимум по ролям пользователя. defaultForms[UserRole] перечисляет подписи форм роли по умолчанию в этом порядке. mobileOnly[UserRole, NavigatorElement] (значение YesNo, показываемое через captionMobileOnly) ограничивает форму по умолчанию только мобильным или только настольным клиентом.
showDefaultForms[] открывает эти формы по порядку при запуске клиента — выполняя каждое действие навигатора или показывая каждую форму через SHOW … NOWAIT — и разворачивает окно, если maximizeDefaultForms задан для любой из ролей текущего пользователя. Выполняется при запуске настольного и веб-клиента (onDesktopClientStarted, onWebClientStarted).
Метакод @addRoleApplicationSetting — точка расширения, объявляющая дополнительное свойство-настройку по роли, размещающая его на панели настроек формы securityPolicy и расширяющая copy[UserRole, UserRole], чтобы её переносить.
Запуск клиента и память
initHeapSize[], maxHeapSize[], minHeapFreeRatio[], maxHeapFreeRatio[] и vmargs[] хранят параметры JVM, передаваемые запускающему настольный клиент.
Класс MemoryLimit именует набор параметров запуска — name[MemoryLimit], maxHeapSize[MemoryLimit], vmargs[MemoryLimit] — для готового варианта запуска клиента. generateJnlpUrls[] строит в exportText[] HTML-список ссылок запуска настольного клиента, по одной на каждый MemoryLimit, с её размером кучи и аргументами JVM.
Поиск по навигатору
Форма findNavigator показывает навигатор деревом и позволяет вводить в findText[] текст для отбора элементов, в подпись которых он входит и которые текущему пользователю разрешено открывать (permit[User, NavigatorElement]); openForm[NavigatorElement] показывает выбранную форму (SHOW … NOWAIT). Добавляется в системное окно навигатора как пункт поиска.
Расширения рефлексии
Модуль расширяет форму рефлексии forms показателями по ролям: countUserPreferences[GroupObject, UserRole] считает пользователей роли, сохранивших настройки для группового объекта, а countUser[PropertyDraw, UserRole, PropertyDrawShowStatus] считает пользователей роли по статусу показа отрисовки свойства. captionShow[PropertyDraw, UserRole] сводит эти счётчики; hide[PropertyDraw, UserRole], columnSort[PropertyDraw, UserRole] и dropSort[PropertyDraw, UserRole] применяют или сбрасывают соответствующую настройку для каждого пользователя роли.
Формы
| Форма | Назначение |
|---|---|
securityPolicy | основная форма политики безопасности: роли с их настройками, деревья элементов навигатора и свойств с колонками прав, а также пользователи роли |
propertyPolicy | политика отдельного свойства (журналирование, обязательность, список выбора, выбор) и его права по ролям |
actionPolicy | права отдельного действия по ролям |
userRolesDialog | диалог выбора роли |
findNavigator | форма поиска по навигатору |
Язык
- Оператор
META— механизм метакода, стоящий за порождаемыми семействами прав на свойства (@initPropertyPermission) и точкой расширения настроек по роли (@addRoleApplicationSetting).
Связано
Политика безопасности— управленческая статья о настройке ролей и доступа; данный модуль служит её основой из стандартной библиотеки.System modules— общий список модулей платформы.Authentication— пользователи, контакты и вход в систему, чьим классамUser/CustomUserназначаются роли.Reflection— метаданные о навигаторе, формах и свойствах, на которые задаются права.