В CRMservice работает гибкая система прав RBAC v2 — на основе registry (permissions + roles + mappings), с маскированием чувствительных полей и локационным скопом (юзер видит только свою локацию).
Это новая система, она вытесняет старую (legacy v1 на JSONB-permissions, оставлена для совместимости). По умолчанию для новых ролей используется v2.
Что нового в v2
| Возможность | Описание |
|---|---|
| Registry прав | Полный каталог прав в БД (resource × action), а не магические строки в коде |
| Шаблоны ролей | Готовые «Менеджер», «Кассир», «Мастер», «Руководитель» — назначаешь и не настраиваешь сотни галок |
| Маскирование полей | Сотрудник может видеть заказ, но без полей «себестоимость» / «маржа» / «зарплата мастера» |
| Locationscope | Можно ограничить юзера своей локацией (показывать заказы только из неё) |
| WORM аудит | Все изменения ролей записываются в неизменяемый журнал (audit_log_rbac, партиционированный по месяцам) |
| Снимок прав в JWT | При выпуске access-токена в JWT встраивается финальный набор прав. Не нужна дополнительный запрос к БД на каждом запросе → быстрее |
Маскирование полей (важная фича)
Это позволяет показать одну и ту же сущность по-разному разным ролям. Например, заказ:
| Поле | Менеджер | Кассир | Руководитель |
|---|---|---|---|
| Номер заказа | ✓ | ✓ | ✓ |
| Клиент | ✓ | ✓ | ✓ |
| Сумма | ✓ | ✓ | ✓ |
| Себестоимость | ✗ | ✗ | ✓ |
| Маржа | ✗ | ✗ | ✓ |
| Зарплата мастера | ✗ | ✗ | ✓ |
| Имя мастера | ✓ | ✓ | ✓ |
Поля группируются в «группы маскирования» (HiddenFieldGroups): financial.cost, financial.margin, personal.salary, и т.п. Можно назначить группу запрещённой для роли — и поля исчезнут из всех JSON-ответов API.
Что в коде
internal/rbac/registry— описание всех прав и ролей.MaskingCatalog— переписывает JSON-ответы, убирает скрытые поля.audit_log_rbac— партиционированный аудит (партиции на квартал вперёд держит rbacEngine.StartPartitionWorker).- Снимок прав в JWT —
resolved_permissionsв access токене.
Настройка
В CRM → Настройки → Роли и права (RolesV2Tab):
- Шаблоны ролей — Менеджер / Кассир / Мастер / Руководитель / Бухгалтер. Назначаем сотрудникам.
- Кастомная роль — создать новую, начать с шаблона, докрутить отдельные права.
- Маскирование — на роли отметить «не показывать группу полей
financial.margin». - Локация — если у вас несколько точек, выбрать «показывать только локацию N».
Журнал изменений прав
Все правки прав видны в Настройки → Роли и права → Аудит:
- Кто изменил роль (включая снимок прав до/после).
- Когда.
- Какое право добавлено/убрано.
Записи нельзя удалить или отредактировать — это WORM (Write Once Read Many) журнал. Соблюдает 152-ФЗ и упрощает аудиты.
Что готовим заранее
- Структура ролей в компании — кто за что отвечает (на бумаге).
- Список локаций (если несколько точек) — заведите в CRM.
- Чувствительные поля — что не должны видеть рядовые сотрудники.
Возможные проблемы
- «У нового сотрудника нет доступа» — забыли назначить роль. Карточка → Роль.
- «Маржу видит менеджер» — настройте маскирование
financial.marginдля роли «Менеджер». - «Видит чужую локацию» — включите location-scope на роли.
- «Не могу удалить запись из аудита» — и не нужно. WORM-журнал, удалять нельзя никому, в том числе админу.