Часть #322 (реализация RBAC). Зависит от: #325 (роли в БД). Следующий: Этап 5, Этап 6.
Цель
Заменить require_admin / require_not_guest / get_current_user + inline role checks на единый require_permission(module, level) во всех 21 роутерах (~332 эндпоинта).
Правила замены
| Текущее |
Целевое |
Пример |
Depends(require_admin) |
Depends(require_permission('module', 'manage')) |
backup, gsm, claude_code |
Depends(require_not_guest) |
Depends(require_permission('module', 'edit')) |
faq create, wiki upload |
Depends(get_current_user) (read) |
Depends(require_permission('module', 'view')) |
chat list, audit view |
user.role == "admin" (owner bypass) |
user_level(user, 'module') >= 'manage' |
chat delete чужих, provider manage |
Чеклист
Инфраструктура
PR 4a — Модуль chat (21 эндпоинт)
PR 4b — Модуль llm (42 эндпоинта)
PR 4c — Модуль channels (45 эндпоинтов)
PR 4d — Модуль sales (70 эндпоинтов)
PR 4e — Модули faq + wiki (22 эндпоинта)
PR 4f — Модули system + speech (56 эндпоинтов)
PR 4g — Остальные модули (46 эндпоинтов)
Финализация
Проверки (для каждого PR)
# Все эндпоинты мигрированного модуля отвечают
curl -s http://localhost:8002/admin/chat/sessions -H "Authorization: Bearer $ADMIN_TOKEN" | jq 'length'
curl -s http://localhost:8002/admin/chat/sessions -H "Authorization: Bearer $OPERATOR_TOKEN" | jq 'length'
# Уровень доступа: operator (edit) может создать
curl -s -X POST http://localhost:8002/admin/chat/sessions \
-H "Authorization: Bearer $OPERATOR_TOKEN" \
-H 'Content-Type: application/json' -d '{}' # → 200
# Уровень доступа: viewer (view) не может создать
curl -s -X POST http://localhost:8002/admin/chat/sessions \
-H "Authorization: Bearer $VIEWER_TOKEN" \
-H 'Content-Type: application/json' -d '{}' # → 403
# Без модуля → 403
# (пользователь с ролью без модуля chat)
# owner_id фильтрация: operator видит только свои, manage видит все
# Lint
ruff check app/routers/
# Health check
curl -s http://localhost:8002/health | jq .status
Файлы
auth_manager.py — require_permission(), удаление старых функций
app/routers/*.py — все 21 файл роутеров
Часть #322 (реализация RBAC). Зависит от: #325 (роли в БД). Следующий: Этап 5, Этап 6.
Цель
Заменить
require_admin/require_not_guest/get_current_user+ inline role checks на единыйrequire_permission(module, level)во всех 21 роутерах (~332 эндпоинта).Правила замены
Depends(require_admin)Depends(require_permission('module', 'manage'))Depends(require_not_guest)Depends(require_permission('module', 'edit'))Depends(get_current_user)(read)Depends(require_permission('module', 'view'))user.role == "admin"(owner bypass)user_level(user, 'module') >= 'manage'Чеклист
Инфраструктура
auth_manager.py:require_permission(module: str, min_level: str)— FastAPI Depends factoryUserс добавленнымpermissions: Dict[str, str]auth_manager.py: кеширование permissions per user (in-memory, invalidate при revoke)require_admin(),require_not_guest(),verify_ownership()после миграции всех роутеровPR 4a — Модуль
chat(21 эндпоинт)app/routers/chat.py: всеget_current_user→require_permission('chat', 'view'|'edit')_check_session_owner_or_admin()→ проверкаmanagelevel вместоrole == "admin"_check_write_access()→ проверкаeditlevel + ownershipPR 4b — Модуль
llm(42 эндпоинта)app/routers/llm.py: read →view, write →edit, vllm/proxy/presets →manageview/edit, bypass дляmanagePR 4c — Модуль
channels(45 эндпоинтов)app/routers/telegram.py: read →view, write →edit, config →manageapp/routers/whatsapp.py: аналогичноapp/routers/widget.py: аналогичноPR 4d — Модуль
sales(70 эндпоинтов)app/routers/bot_sales.py: read →view, write →editapp/routers/amocrm.py: read →view, write →edit, OAuth/dataset →managePR 4e — Модули
faq+wiki(22 эндпоинта)app/routers/faq.py: list/get →faq:view, create/update/delete →faq:editapp/routers/wiki_rag.py: stats/search →wiki:view, upload/delete →wiki:edit, reindex →wiki:managePR 4f — Модули
system+speech(56 эндпоинтов)app/routers/services.py: view →system:view, start/stop →system:manageapp/routers/monitor.py: all →system:viewapp/routers/backup.py: all →system:manageapp/routers/gsm.py: all →gsm:manageapp/routers/tts.py: view/test →speech:view, presets →speech:editapp/routers/stt.py: all →speech:viewPR 4g — Остальные модули (46 эндпоинтов)
app/routers/kanban.py: view →kanban:view, create/update →kanban:edit, delete →kanban:manageapp/routers/audit.py: all →audit:view, cleanup →audit:manageapp/routers/usage.py: view →usage:view, limits →usage:manageapp/routers/claude_code.py: all →claude_code:manageapp/routers/legal.py: public endpoints без изменений; admin →settings:manageapp/routers/auth.py: profile → любой аутентифицированный; users CRUD →users:manageФинализация
require_admin,require_not_guest,verify_ownershipизauth_manager.pyrequire_admin,require_not_guest,role == "admin",role != "guest"ruff check .— lint проходитПроверки (для каждого PR)
Файлы
auth_manager.py—require_permission(), удаление старых функцийapp/routers/*.py— все 21 файл роутеров