Пользователи и группы
Колонка users.role убрана; права теперь складываются из личных флагов и членства в группах. Это гибкая модель: разные сайты могут настроить роли по-своему без вмешательства в код.
Модель: флаги + группы #
Итоговый набор прав пользователя — это union двух источников:
users.flags— личные флаги (override)groups.flagsдля всех групп, в которых юзер состоит (черезusers__groups)
public static function flags(): string { $personal = (string)($_SESSION['user_flags'] ?? ''); $group = (string)($_SESSION['user_group_flags'] ?? ''); return $personal . $group; }
При логине обе строки загружаются в сессию; для мобильного REST то же делает TokenService::resolveBearer.
Каталог флагов #
Флаг — это одна буква a–z. Описания и человекочитаемые подписи хранятся в таблице settings__flags и редактируются в админке. Стандартный набор:
| Флаг | Назначение |
|---|---|
a | Создание контента |
b | Редактирование чужого контента |
c | Удаление |
d | Управление пользователями (protected) |
e | Управление модулями (protected) |
f | Управление настройками (protected) |
n | Редактирование меню |
r | Чтение логов |
z | ROOT — полный доступ (protected) |
Защищённые (protected) флаги нельзя удалить из админки. Можно добавлять свои буквы — главное соблюдать соглашение «одна буква a–z».
Группы пользователей #
Группа — это именованный набор флагов. Пользователь, добавленный в группу, автоматически получает все её флаги. Это удобнее, чем выдавать буквы каждому персонально.
Дефолтная группа admin создаётся миграцией и даёт z. Её нельзя удалить (is_protected = 1).
Создание группы — Группы → Создать:
- Slug — латиница a–z, цифры, дефис. Не меняется после создания.
- Название — для людей, отображается в списках.
- Флаги — чекбоксы, можно выбрать любую комбинацию из каталога.
Карточка пользователя #
В форме создания/редактирования юзера — два независимых блока:
- Группы (multi-select) — определяют базовый набор флагов
- Личные флаги — override поверх групп, для точечных корректировок
Также: логин, пароль, локаль интерфейса. Аватар и 2FA — редактируются самим юзером в Профиле.
Связь user↔group хранится в users__groups с ON DELETE CASCADE — удаление юзера или группы автоматически чистит связи.
Что такое z и кто root #
z — особый флаг. Когда Auth::hasFlag('x') вызывается с любой буквой x, проверка сразу возвращает true, если у юзера есть z:
if (str_contains($f, 'z')) return true; // root всегда проходит return str_contains($f, $flag);
Legacy-проверки вроде Auth::isRole('admin') остались для совместимости, но теперь они означают «есть z» — личный или через группу.