Роли и доступ¶
Система ролей позволяет ограничивать доступ к обработчикам. Каждый пользователь может иметь одну или несколько ролей.
Общая схема¶
flowchart LR
П[Пользователь] -->|нажимает кнопку| D{Декоратор}
D -->|проверяет роли| RR[RoleRepo]
RR -->|роли найдены| H[Handler выполняется]
RR -->|нет доступа| A[Alert / Сообщение об ошибке]
Как работает проверка¶
- Пользователь вызывает обработчик (нажимает кнопку или отправляет сообщение)
- Декоратор перехватывает вызов и запрашивает роли пользователя из
RoleRepo - Если у пользователя есть хотя бы одна из
allowed_roles— обработчик выполняется - Если нет — показывается alert (для callback) или сообщение об ошибке (для message)
- Если
allowed_roles = None— доступ открыт всем
Два типа декораторов¶
| Декоратор | Тип обработчика | Обратная связь при отказе |
|---|---|---|
@check_roles |
Callback (нажатие кнопки) | Alert через callback_answerer |
@check_message_roles |
Message (текстовое сообщение) | Сообщение через message_sender |
Требования к обработчику¶
Чтобы декоратор работал, класс обработчика должен содержать:
| Атрибут | Обязательный | Назначение |
|---|---|---|
role_repo |
Да | Источник ролей пользователя |
allowed_roles |
Да | Набор допустимых ролей (None = все) |
callback_answerer |
Нет | Показ alert при отказе (для @check_roles) |
message_sender |
Нет | Отправка сообщения при отказе (для @check_message_roles) |
Хранение ролей¶
Роли определяются в файле data/roles.json и загружаются при старте приложения. Назначение ролей пользователям хранится в PostgreSQL.
flowchart LR
JSON["roles.json<br/>(определение ролей)"] --> APP[BotApplication]
DB["PostgreSQL<br/>(назначение ролей)"] --> RR[RoleRepo]
APP --> RR
Подробнее
Формат файла ролей — в разделе Конфигурация. Примеры кода декораторов — в разделе Декораторы.