====== Этап разработки системы прав ====== [[start:|lss]] ===== Введение ===== На этом этапе мы разработаем экраны списка ролей и пользователей системы, наладим работу контроллера прав, проставим права в описатели таблиц, главное меню системы. ===== Развертывание этапа на площадке ===== * Скачаем архив **LSS проекта** для текущего этапа. * Обновим проект из архива. Надо быть осторожным с конфигурационным файлом площадки **php/config/config-place.php**, он содержит текущие параметры соединения с базой данных, его обновлять не надо. * Выполним с помощью утилиты **pgAdmin** скрипт обновления содержимого системных таблиц, файл **export-import/backup/backup.sql**. ==== Описание ==== === Экранная форма ролей formRole === Описание экранной формы ролей расположено в файле **php/perm/formRole.xml**. Это описание практически идентично описанию стандартной формы справочника. === Экранная форма пользователей formUser === Описание экранной формы ролей расположено в файле **php/perm/formUser.xml**. Это описание практически идентично описанию стандартной формы справочника. === Контроллер источника данных пользователей === Файл контроллера **php/datasources/user.php**: class DataSource_User_Ext extends DataSource_User { protected function onRowAfter(&$row, $params=Array()) { if ($row['password']) $row['password']='***'; } protected function onBeforeSave(&$params) { if ($params['password']) $params['password']=cryptPassword($params['password']); } } return new DataSource_User_Ext(); * обработчик **onRowAfter** скрывает отображение паролей пользователей, заменяя их на звездочки. * обработчик **onBeforeSave** шифрует пароль пользователя перед сохранением в базе данных. Функция **cryptPassword** обеспечивает простейшее шифрование по **md5** с солью. * в описатель поля **password** таблицы **user** добавлен атрибут **save=1** (см экранную форму **Разработка/Структура базы**). В результате правка этого поля вызывает автоматическое сохранение изменений строки таблицы. А в ответе вместо значения поля пароля приходят звездочки. === Контроллер прав доступа === Контроллер прав доступа PermController размещен в файле **php/perm.php**: execDisconnect(); session_start(); try { if ($login==getCfg('root.login','root') && cryptPassword($password)==getCfg('root.password')) { $_SESSION['connect_isconnected']=true; $_SESSION['connect_login']='root'; if (getCfg('root.enabled', true)) { $_SESSION['connect_isroot']=true; } else { $_SESSION['connect_role']='АДМ'; } return true; } $sql_login=$this->str2Sql($login); $sql_password=$this->str2Sql(cryptPassword($password)); $sql=<<pdoFetch($sql); if ($rec['id']) { $_SESSION['connect_isconnected']=true; $_SESSION['connect_login']=$rec['fio']; $_SESSION['connect_role']=$rec['role_code']; return true; } } finally { // защита от CSRF уязвимости посредством токена if (getCfg('csrftoken.enabled')) $_SESSION['connect_csrftoken']=getGUID(); session_write_close(); } return false; } } return new PermControllerPrj(); * метод **execConnect** вызывается диалогом аутентификации посредством запроса **connect**. Отдельно проверяется пользователь **root**, его параметры берутся из конфигурационного файла. Отдельно проверяются все остальные пользователи - на основе содержимого таблицы **user**. Если логин и пароль указаны правильно, то параметры пользователя сохраняются в сессии. * метод **getPerm** проверяет доступность по правам текущему пользователю режима работы системы. Используем следующие режимы: * **connected** - доступно всем авторизованным пользователям. Если проверка не прошла, то пользователя автоматически перенаправляют на экран аутентификации, посредством отправки ответа **disconnected**. * **root** - доступно только пользователю **root**, например пункт меню **Разработка** должен быть доступен только программисту. * **ref** - справочники, на чтение доступны всем авторизованным пользователям, правка только администратору * **rootref** - системные справочники, на чтение доступны всем авторизованным пользователям, правка только root * **machine** - работа с оборудованием и ремонтами, на чтение доступно всем авторизованным пользователям, правка доступна администратору и роли ПРВ * **report** - выполнение отчетов, доступно всем авторизированным пользователям * **perm** - пользователи и права, доступно только администратору === Права в описателях структуры данных === Экранная форма **Разработка/Структура базы** позволяет назначить режим прав каждой таблице (поле **Режим по правам**). Затем можно вызвать **Пересчет/Генерация классов DataSource** и перенести эти права в контроллеры источников данных **DataSource**. Помимо режима прав (параметр **mode**) **DataSource** делит запросы на операции (параметр **operation**) **read** и **write**. Соответственно, контроллер прав **PermController** определяет доступность соответствующей операции текущему пользователю. === Права в главном меню системы === Проставим права в описании главного меню системы, файл **php/config/appmenu.xml**: === Права в контроллерах отчетов === Добавим проверку прав в контроллеры отчетов **plan** и **fact**: class ReportPlan extends ReportController { public function getParams() { if (!getPerm('report','read')) throw new Exception('У Вас нет прав на выполнение этого отчета'); ... ===== Демонстрационные примеры и ссылки ===== Демонстрационные примеры доступны в режиме "**только чтение**". Для входа используйте логин **root**, пароль **1**. * демонстрация работы **тестового примера** "Материальные активы" у нас на сайте: [[https://lss.m-cti.ru/storage/example/lss-exampl]]