Абстракция require()
Эндпоинт проверяет наличие нужного permission, а не
конкретную роль.
как
В v1 require() сопоставляет permission с ролью
по статической таблице ROLE_PERMISSIONS. Сюда же
подключится тонкая настройка прав из v2.
RBAC middleware
FastAPI-зависимость — единая точка проверки: принимает
требуемый permission, не роль. Роль на эндпоинтах
напрямую не проверяется.
смена роли
Роль берётся из claim access-токена — её свежесть и чтение
из БД для критичных проверок описаны в
JWT claims.
Проверка владения ресурсом
RBAC отвечает «можно ли действие вообще», владение — «над
своим ли объектом». Личные агенты и API-ключи доступны
только владельцу: эндпоинт сверяет owner_id
ресурса с текущим user_id поверх permission.
Защита от IDOR.
v2 Командное владение — доступ
участников к ресурсам своей команды — появляется с
capability Team Lead.
зачем поверх RBAC
Без проверки владения один Member
редактировал бы агента другого — типовой IDOR. Owner /
Admin обходят проверку владения только там, где это их
штатная зона (управление пользователями), не для доступа к
данным источников.
Граница админских прав
Owner и Admin видят данные
строго в рамках source ACL, как Member. Сквозного обхода ACL
по роли нет.
break-glass и аудит
Экстренный доступ в обход source ACL —
это отдельная явная настройка с обязательной
записью в журнал.
Admin Panel.
Гранулярные permissionsv2
Таблицы permissions и
user_permissions дают тонкую настройку прав поверх
ролей.
детали и приоритет
Позволяют расширить или урезать права отдельного
пользователя. Назначаются через
Admin Panel. Приоритет однозначный:
явный запрет (deny) важнее
любого разрешения — от роли или точечного гранта.
Сначала складываются гранты (роль + расширения), затем
вычитаются deny.