Разрешения (permissions), роли и ранги

Документ описывает каталог разрешений, базовые роли, связи роль↔разрешение и ранговую иерархию.

1. Таблица permissions

Создаётся и заполняется миграцией m260922_080010_create_permission_tables.php.

КодОписание
users.listПросмотр списка локальных пользователей
users.read.selfПросмотр собственного локального пользователя
users.read.anyПросмотр любого локального пользователя
user_roles.readПросмотр назначенных ролей
user_roles.manageНазначение и снятие ролей
roles.readПросмотр ролей
roles.manageСоздание, изменение и удаление ролей
system.manageУправление системными справочниками
rbac.permissions.manageУправление permissions ролей

В params.php (permission_rules) упоминаются также логические roles.manage (POST/PUT/DELETE /roles) и roles.read (GET /roles), users.list/users.read (GET /users), user_roles.read|manage — они маппятся на конкретные коды через resolveConcretePermission (self/any). Отдельный пермишен users.read в БД НЕ заводится — есть .self и .any.

2. Таблица role_permissions

Связь многие-ко-многим: (role_id, permission_id) — композитный PK, FK на roles и permissions (CASCADE).

3. Сид ролей и связей

Роли (ядро, миграция m260922_080002_seed_basic_data.php)

РольОписание
userЗарегистрированный пользователь
adminАдмин, имеет все полномочия в системе

Связи роль → разрешения (сеются в миграции permissions)

РольРазрешения
userusers.read.self, user_roles.read
adminвсе: users.list, users.read.any, user_roles.manage, roles.read, roles.manage, system.manage, rbac.permissions.manage

4. Ранги (role_ranks)

Заданы в modules/rbac/config/params.php:

'role_ranks' => [
    'user'  => 10,
    'admin' => 50,
],

Правило: субъект может назначить/снять роль только с рангом ниже своего собственного.

Это защищает от эскалации привилегий: даже имея разрешение user_roles.manage, нельзя выдать роль admin без ранга 50+.

5. Автоматическое назначение ролей при синхронизации

SyncUserHandler (ядро):

  1. Всегда назначается роль user.
  2. Если isOwner == true (владелец в Passport) — дополнительно роль admin.

Роли «синкаются» через IUserRoleRepository::sync() — повторные вызовы не создают дубликаты.

6. PermissionDto

Файл: modules/rbac/application/dto/PermissionDto.php

Представление разрешения для контроллера PermissionController и RolePermissionController (поля: id, code, description; фабрика fromEntity/fromRow).

7. Permission (value object)

Файл: modules/rbac/domain/valueObject/Permission.php

Обёртка над кодом разрешения (строка). Используется как результат IPermissionRepository::findByCode().