12. Роли и права
Роли определяют права доступа пользователей к объектам системы. Поддерживается контроль на уровне строк (RLS).
12.1. Синтаксис роли
РОЛЬ ИмяРоли
ДОСТУП ИмяОбъекта СПИСОК_ДЕЙСТВИЙ
ДОСТУП ИмяОбъекта ПОЛНЫЙ
ОГРАНИЧЕНИЕ_ДОСТУПА ИмяОбъекта ГДЕ условие
КОНЕЦ_РОЛИ
12.2. Действия (права)
| Действие | Разрешает |
|---|---|
| ЧТЕНИЕ | Просмотр записей |
| ДОБАВЛЕНИЕ | Создание новых записей |
| ИЗМЕНЕНИЕ | Редактирование записей |
| УДАЛЕНИЕ | Физическое удаление |
| ПРОВЕДЕНИЕ | Проведение/распроведение документов |
| ПОЛНЫЙ | Все вышеперечисленные (кроме ПРОВЕДЕНИЕ) |
12.3. Пример роли менеджера
РОЛЬ Менеджер
ДОСТУП Клиенты ЧТЕНИЕ, ДОБАВЛЕНИЕ, ИЗМЕНЕНИЕ
ДОСТУП ЗаказНаряд ЧТЕНИЕ, ДОБАВЛЕНИЕ, ИЗМЕНЕНИЕ, ПРОВЕДЕНИЕ
# Менеджер видит только свои заказы
ОГРАНИЧЕНИЕ_ДОСТУПА ЗаказНаряд ГДЕ Менеджер = ТЕКУЩИЙПОЛЬЗОВАТЕЛЬ()
КОНЕЦ_РОЛИ
12.4. Пример роли директора филиала (мультифирма)
РОЛЬ ДиректорФилиала
ДОСТУП ЗаказНаряд ПОЛНЫЙ, ПРОВЕДЕНИЕ
# Видит только заказы своей организации
ОГРАНИЧЕНИЕ_ДОСТУПА ЗаказНаряд ГДЕ Организация = ТЕКУЩАЯ_ОРГАНИЗАЦИЯ()
КОНЕЦ_РОЛИ
12.5. Создание пользователя
ПОЛЬЗОВАТЕЛЬ admin
ПАРОЛЬ "admin123"
ПОЛНОЕ_ИМЯ "Администратор Системы"
ЭЛЕКТРОННАЯ_ПОЧТА "admin@3erp.ru"
РОЛЬ Администратор
КОНЕЦ_ПОЛЬЗОВАТЕЛЯ
12.6. Системные функции для RLS
| Функция | Возвращает |
|---|---|
| ТЕКУЩИЙПОЛЬЗОВАТЕЛЬ() | Объект текущего пользователя (с полями id, login, full_name, role) |
| ТЕКУЩАЯ_ОРГАНИЗАЦИЯ() | Объект текущей организации (из контекста сессии) |
12.7. RLS в процедурах (прямые SQL-запросы)
Важно: при использовании ЗАПРОС() RLS не применяется автоматически. Нужно добавить условие вручную:
ПРОЦЕДУРА ПолучитьМоиЗаказы
ВЫЧИСЛИТЬ ТекПользователь = ТЕКУЩИЙПОЛЬЗОВАТЕЛЬ().id
ВЫЧИСЛИТЬ SQL = "SELECT * FROM ЗаказНаряд WHERE Менеджер = " + ТекПользователь
ВЫЧИСЛИТЬ Результат = ЗАПРОС(SQL)
ВОЗВРАТ Результат
КОНЕЦ_ПРОЦЕДУРЫ
12.8. Проверка прав в процедурах
ПРОЦЕДУРА УдалитьКлиента
ВЫЧИСЛИТЬ Пользователь = ТЕКУЩИЙПОЛЬЗОВАТЕЛЬ()
ЕСЛИ Пользователь.role != "Администратор" ТО
ОШИБКА "У вас нет прав на удаление"
КОНЕЦ
# ... код удаления ...
КОНЕЦ_ПРОЦЕДУРЫ