# Урок 10. Администрирование, аудит Цель данного урока познакомить слушателя с принципами администрирования и аудита. ## Аудит Аудит предназначен для фиксации различных событий при работе пользователей в системе: вставка, изменение, удаление, выполнение операций, и т.д. Аудит является сервисной возможностью и может быть включен для любого класса в системе. Для изучения смотри: - [Руководство разработчика: Сервисные возможности для классов # Аудит](books/AppGuide/030_class/070_сервисы_класса.md#аудит) ## Пользователь С точки зрения системы пользователем является учетная запись, на которую выдается перечень прав дающий возможность юридическому или физическому лицу выполнять действия в системе. Для изучения смотри: - [Администрирование приложений: Введение # Пользователь](books/AppAdministration/020_введение.md#пользователь) ## Администрируемый объект `Администрируемый объект` - это логически связанный для массовой раздачи прав набор привилегий. Административный объект генерируется по объектам системы и позволяет единым образом выдавать права на них. Для изучения смотри: - [Администрирование приложений: Введение # Администрируемый объект](books/AppAdministration/020_введение.md#администрируемый-объект) ## Объектные привилегии `Объектные привилегии` позволяют раздавать права на бизнес логику. Для изучения смотри: - [Администрирование приложений: Введение # Объектные привилегии](books/AppAdministration/020_введение.md#объектные-привилегии) ## Элементарная привилегия `Элементарные привилегии` используются для разграничения действий пользователя в пользовательском интерфейсе. Для изучения смотри: - [Администрирование приложений: Введение # Элементарная привилегия](books/AppAdministration/020_введение.md#элементарные-привилегии) ## Роль `Роль` - административная единица для выдачи прав. В роле выдаются гранты на привилегии. Для изучения смотри: - [Администрирование приложений: Введение # Роль](books/AppAdministration/020_введение.md#роль) ## Профиль пользователя `Профили пользователя` используются для группировки ролей и более удобной раздачи их пользователю. Для изучения смотри: - [Администрирование приложений: Введение # Профиль пользователя](books/AppAdministration/020_введение.md#профиль-пользователя) ## Практика ### Аудит 1. Включите аудит на документе `Lbr_InAct` и его позициях `Lbr_InActDet` 2. Создайте структуру хранения аудита для класса `Lbr_InAct` 3. Создайте новый документ 4. Посмотрите аудит по новому документу. #### Произвольная запись в аудит. 1. Включите аудит на справочнике `Lbr_Publisher` 2. Доработайте операцию `Обновить характеристики`: если успешно введены санкции, то в аудит пишется запись "Санкции успешно введены". Для создания произвольной записи используйте метод `ru.bitec.app.btk.class_.service.audit.Btk_AuditPkg#insertRow` ### Синхронизация исходного кода и данных администрирования 1. Обновить администрируемые объекты модуля lbr. \ [Руководство администратора: Приложение администратор # Групповая настройка привилегий ролей](books/AppAdministration/030_приложение_администратор.md#групповая-настройка-привилегий-ролей) ### Создание роли доступа к приложению 1. Откройте список ролей. 2. В дереве групп добавьте новую группу `Роли библиотеки` 3. В новой созданной группе создайте роль `Доступ к библиотеке` - на закладке `Приложения, доступные для роли` выдайте права на приложение `Управление библиотекой` ### Создание профиля 1. Откройте список профилей. 2. В дереве групп добавьте новую группу `Профили библиотеки` 3. В новой созданной группе создайте профиль `Библиотека, только чтение` 4. Подключите к профилю роль `Доступ к библиотеке` ### Создание шаблона пользователя 1. Откройте список пользователей. 2. В дереве групп добавьте новую группу `Пользователи библиотеки` 3. В новой созданной группе создайте запись и укажите значение полей: - Учетная запись = `LbrUserTemplate` - Тип = `Внутренний пользователь` - Является шаблоном = `true` - Наименование шаблона = `Пользователь библиотеки` - Выводить под операцией создания = `true` 4. Выдайте права на профиль `Библиотека, только чтение` ### Создание пользователей 1. Переоткройте список пользователей, чтобы обновилась клонируемая операция создания по шаблону. 2. Под операцией `Создать` теперь доступна операция `Пользователь библиотеки` 3. Используя новую операцию создайте пользователей: - `userRO` - `userFull` 4. Изначально пароль идентичен логину. Что бы оставить его, необходимо убрать галочку `Пользователь должен сменить пароль авторизации` (рекомендуется сделать простой пароль или оставить его равным логину, для последующего быстрого тестирования). 5. Пользователи обладают всеми настройками шаблона, и имеют права на профиль `Библиотека, только чтение` 6. Выполните для обоих пользователей операцию `Пересчитать индексацию привилегий` ### Проверка работоспособности пользователей 1. Авторизуйтесь под обоими пользователями, и проверьте, что доступно одно приложение (когда у пользователя доступно одно приложение, оно сразу запускается без выбора.) ### Разграничение прав на заказы 1. Создайте роль `Просмотр заказов` 2. На закладке `Права роли` найдите адм. объекты `Lbr_InOrder` и `Lbr_OutOrder` 3. Снимите с них признак `Не распространяются настройки администрирования` 4. И выдайте права на Чтение для всего адм. объекта. 5. Профилю `Библиотека, только чтение` подключите роль `Просмотр заказов` 6. В карточке профиля выполните операцию `Пересчитать индексацию привилегий для всех пользователей профиля` 7. Зайдите под пользователями и убедитесь, что теперь они не могут редактировать заказы. 8. Создайте роль `Редактирование заказов` 9. Для адм. объектов `Lbr_InOrder` и `Lbr_OutOrder` выдайте ей права `Полный доступ` 10. Создайте профиль `Библиотека, полный доступ`, подключите к нему роль `Редактирование заказов` 11. Пользователю `userFull` выдайте профиль `Библиотека, полный доступ` 12. Синхронизируйте привилегии пользователя `userFull` 13. Прелогиньтесь под пользователем `userFull` и убедитесь, что у него есть полные права на заказы. 14. Прелогиньтесь под пользователем `userRO` и убедитесь, что у него остались права только на чтение заказов ### Разграничение прав на пункты меню 1. Каждое приложение - отдельный адм. объект. Снимите с адм. объекта `Lbr_MainMenuAvi` признак `Не распространяются настройки администрирования` 2. Перейдите в карточку роли `Доступ к библиотеке` 3. Перейдите на закладку `Приложения, доступные для роли` 4. Откройте детализацию, выдайте доступ ко всем `элементарным привилегиям`, кроме `Настройки` 5. Выполните операцию `Пересчитать индексацию привилегий для всех пользователей роли` 6. Перелогиньтесь под пользователями, убедитесь, что для них не доступен пункт меню "Настройки" 7. Создайте роль `Настройка библиотеки` 8. Выдайте ей права на приложение библиотеки, и на пункт меню `Настройки` 9. Выдайте эту роль пользователю `userFull` 10. Проверьте, что у пользователя появились права на пункт меню ### Управление типом привилегии операции. 1. В `Lbr_PublisherAvi` для операций `Дополнительно` и `Статистика текущей группы` смените тип привилегии на чтение, используя аннотацию `AcPrivilegeType` 2. Соберите проект, обновите адм. объект `Lbr_Publisher` 3. Создайте роль `Просмотр издателей` - выдайте ей права только чтение на адм. объект `Lbr_Publisher` - выдайте `userFull` и `userRO` права на эту роль 4. Пересчитайте индексацию для пользователей роли (операция в карточке или списке ролей), убедитесь что у пользователей `userFull` и `userRO` появилась операции `Дополнительно` и `Статистика текущей группы` а издательства не редактируются ### Запрет элементарной привилегии 1. Создайте роль `Запрет просмотра статистики по группе издательств` 2. Найдите адм. объект `Lbr_Publisher` и для адм. элемента `Lbr_PublisherAvi#Default`, в детализации установите признак `Запрещено` на операции просмотра статистики по группе. 3. Создайте новый профиль, подключите к нему эту роль, выдайте профиль пользователю `userRO` 4. Пересчитайте индексацию для пользователей, убедитесь что у пользователя `userRO` нет доступа к операции просмотра статистики ### Администрирование переходов состояний 1. Для адм. объекта `Lbr_OutOrder` снимите признак `Не требуется настройка прав доступа на состояния`. 2. Для класса `Lbr_OutOrder` добавьте новоё состояние `Согласуется` и настройте переходы состояний. \ ```{note} Переход состояний должен быть: Оформляется -> Согласуется -> Выполнен ``` [Руководство разработчика: Тип объекта # Переходы состояний](books/AppGuide/030_class/075_тип_объекта.md#переходы-состояний) 3. Создайте роль `Права на все переходы состояний`, дайте ей доступ на все возможные переходы адм. объекта `Lbr_OutOrder` 4. Создайте роль `Права на перевод в Согласуется`, дайте ей доступ на перевод только в `Согласуется` для адм. объекта `Lbr_OutOrder` 5. Выдайте этим ролям права на редактирование атрибута `Состояние` элемента `Lbr_OutOrderAvi#Default` 6. Роль `Права на перевод в Согласуется` выдайте профилю `Только чтение`, пересчитайте индексацию пользователей профиля. 7. Роль `Права на все переходы состояний` выдайте профилю `Полный доступ`, пересчитайте индексацию пользователей профиля. 8. Зайдите под пользователем `userRO` в систему, он может переводить состояния заказов `Lbr_OutOrder` только в `Согласуется` 9. Зайдите под пользователем `userFull` в систему, он может переводить заказы `Lbr_OutOrder` в любое состояние ### Объектные привилегии 1. Объявите в классе `Lbr_Publisher` новую объектную привилегию `Ввод санкций` [Руководство администратора: Введение # Объектные привилегии](books/AppAdministration/020_введение.md#объектные-привилегии) 2. Соберите проект, обновите адм. объект `Lbr_Publisher` 3. В `Lbr_PublisherApi` переопределите метод установки объектных характеристик `setAttrValue` (см. урок 6), в котором: - проверяйте, если устанавливается значение атрибута с именем `dSanctionBegin`, проверяйте наличие объектной привилегии "Ввод санкций" методом `ru.bitec.app.btk.Btk_AdminPkg#hasObjPriv` - если привилегии у пользователя нет, то выдавайте ошибку `Не удалось ввести санкции в отношении , т.к. не достаточно прав` 4. Создайте роль `Ввод санкций на издательства` 5. Выдайте ей права на объектную привилегию `Ввод санкций` 6. Выдайте роль пользователю `userFull` через профиль `Полный доступ` 7. Для роли `Просмотр издателей` выдайте права на операцию `Обновить характеристики`. 8. Синхронизируйте пользователей, проверьте что у обоих юзеров есть права на операцию, но `userRO` при попытке ввести санкции получает ошибку о недостаточности прав, а `userFull` успешно их вводит. ### Управление принадлежностью выборки к адм. объектам В этом примере будет разобран пример, когда стандартное определение адм. объекта не будет работать. 1. Создайте отображение для отображения связей документов в отдельной форме - в `Lbr_linkAvi` создайте новый `trait` `List_gidDocForChoose` наследник от `List_gidDoc` - переопределите в нем метод `getGidMaster`, он должен получать значение переменной `gidDoc_dz` в текущей выборке (`getVar`) - создайте метод создания отображения - объявите в `avm` новое отображение 1. В `Lbr_InOrderAvi` создайте новую операцию: - тип привилегии - Чтение - операция открывает выборку `Lbr_linkAvi#List_gidDocForChoose` с передачей в нее параметра с именем `gidDoc_dz` и значением равным `gid`-у текущей записи 1. Соберите проект, и под пользователем `admin` попробуйте выполнить эту операцию, вы должны увидеть все связи текущего заказа. 1. Теперь попробуйте сделать это под одним из ограниченных пользователей. Перед этим нужно обновить адм. объект `Lbr_InOrder` и пересчитать индексацию пользователей, т.к. появилась новая операция. Пользователи при открытии списка связей в отдельной форме не будут иметь прав на выборку, хотя эта же выборка хорошо работает как закладка, и права на нее выданы. Это происходит из-за того, что стандартный способ определения адм. объекта не работает, когда мы открыли коллекцию переменной ссылочности вне формы мастера. В этом случае необходимо самому определять алгоритм определения адм. объекта. 1. Т.к. мы отображаем записи одного документа, то адм. объект будем определять от переданного gid-а, для этого в `Lbr_linkAvi#List_gidDocForChoose`: - переопределите метод acObject, который определяет класс из переданного `gid`-а, и возвращает имя этого класса (т.к. имя адм. объекта равно имени класса) - переопределите метод acObjectItem, чтобы он возвращал строку вида: `<Имя класса>\Lbr_linkAvi` - так же как эта коллекция отображается в администраторе в детализации к адм. объекту, но без суффикса `#Default` ### Создание отдельной группы элементарных привилегий #### Отображение как отдельный элемент 1. Для отображения `Lbr_linkAvi#List_gidDocForChoose` укажите в `avm` свойство `acItemRep="List_gidDocForChoose"` 1. Обновите адм. объект `Lbr_InOrder` 1. В списке элементов появилась новая запись `Lbr_InOrder\Lbr_linkAvi#List_gidDocForChoose`. Теперь отображение `Lbr_linkAvi#List_gidDocForChoose` администрируется как отдельный элемент, и позволяет выдавать на него права отличные от всех остальных отображений. #### Элементарные привилегии как отдельный элемент 1. В `Lbr_InOrderAvi` для операции отображения связей документа и удаления укажите аннотацию `@AcItemRep(name="SeparatePrivs")` 1. Обновите адм. объект `Lbr_InOrder` 1. В списке элементов появилась новая запись `Lbr_InOrderAvi#SeparatePrivs`. Теперь на эти операции можно выдавать права через отдельный элемент. ### Методы работы с правами пользователя В главном меню приложения `Управление библиотекой` добавьте операцию `Информация о пользователе` под пунктом меню `Помощь`. Операция должна выводить сообщение следующего вида: ``` Идентификатор пользователя: 101 Имя пользователя: userFull Супер-пользователь: нет Количество ролей пользователя: 42 Есть роль "Права на все переходы состояний": да ``` ```{note} - Получить ИД пользователя `Btk_UserApi().getCurrentUserID()` - Получить имя пользователя `Btk_UserApi().getCurrentUserName` - Признак супер-пользователя `session.user.isSuperUser` - Получить поли пользователя `Btk_UserApi().getRoles` - Проверка наличия роли `Btk_AdminPkg().hasRole` ``` ### Замещение прав 1. В замещении прав укажите, что `userRO` замещает `userFull` 1. Синхронизируйте пользователей, убедитесь что `userRO` обладает всеми правами пользователя `userFull`