Модель ролей

Роли в Raito намеренно простые. Понимание модели избавляет от сюрпризов, особенно вокруг того, кто что может выдать.

Одна роль на пользователя, без иерархии

У каждого пользователя ровно одна сохранённая роль (или ни одной). Роли плоские: нет порядка, в котором owner «включает» administrator. Роль-фильтр проходит, только если сохранённая роль пользователя совпадает с ней. Поэтому вы пишете OWNER | ADMINISTRATOR | MODERATOR и перечисляете каждую роль, которая должна проходить, ведь ни одна не подразумевает другую.

Значит, | это ИЛИ по ролям, и это единственный нужный комбинатор: при одной роли на пользователя И (AND) никогда бы не совпало.

Роли как фильтры

Встроенная роль вроде OWNER это объект-фильтр. Когда aiogram её вычисляет, она спрашивает у менеджера ролей, есть ли у текущего пользователя этот slug роли, используя id бота и id пользователя. Так как Raito регистрирует себя в контексте диспетчера, эта проверка доступна каждому хендлеру и фильтру через внедрение зависимостей.

Те же фильтры несут и метаданные (эмодзи и подпись роли) во флагах, которые читает register_commands(), чтобы настроить меню команд под каждого пользователя.

Где хранятся роли

Провайдер вы никогда не создаёте напрямую. Raito выбирает его по переданному FSM-хранилищу storage:

  • MemoryStorage → в памяти (теряется при перезапуске);

  • JSONStorage → файл JSON;

  • хранилище Redis → Redis;

  • хранилище SQLite / PostgreSQL → таблица SQL.

Все провайдеры реализуют один интерфейс IRoleProvider, поэтому остальная система не зависит от бэкенда. Память и JSON для разработки; при production=True Raito предупредит об их использовании.

Разработчики особенные

ID пользователей, переданные в developers, неявно держат роль developer без всякой записи в бэкенде. Так вы даёте доступ себе, пока никакая роль ещё не назначена.

Оговорка про эскалацию

Назначение плоское, и у этого есть последствие для безопасности, которое стоит проговорить прямо: любой, кто может управлять ролями (developer, owner или administrator), может выдать любую роль кому угодно, включая owner и developer. Единственные встроенные ограничители: нельзя менять свою роль и не-управляющий не может назначать вовсе, но два администратора могут повысить друг друга.

Так как developer может включить инструменты выполнения кода .rt eval / .rt bash (когда бот это разрешил через enable_dangerous_commands=True), относитесь к управляющим ролям как к уровню доверенного оператора. Если нужна более строгая политика (настоящая иерархия или «только owner выдаёт owner»), унаследуйтесь от RoleManager и проверяйте это в assign_role.