Управление RBAC
Система контроля доступа на основе ролей с поддержкой ролей, прав, wildcard-ов, правил и CLI-утилит
GolOps включает систему RBAC (role-based access control) для управления правами пользователей через роли. В системе есть database schema, функции модели, проверка прав и CLI-утилиты.
Архитектура
RBAC состоит из четырех таблиц базы данных:
| Таблица | Описание |
|---|---|
permission | Описание прав в формате resource:action, например user:read |
role | Роли, поддержка наследования и системных флагов |
role_permission | Связь ролей и прав, с поддержкой wildcard и conditional rules |
user_role | Назначение ролей пользователям с поддержкой срока действия |
Роли по умолчанию
Выполните pnpm rbac init, чтобы создать роли и права по умолчанию:
| Роль | Описание | Права |
|---|---|---|
super_admin | Суперадминистратор | * (все) |
admin | Администратор панели | user:*, order:read, credit-package:*, config:read, role:read |
banned | Заблокированный пользователь | Нет |
Права по умолчанию
Права используют формат resource:action и соответствуют реальным функциям панели:
| Ресурс | Действие | Описание |
|---|---|---|
user | read, ban, grant-credit, manage-role | Управление пользователями |
order | read | Просмотр заказов |
credit-package | read, create, update, delete | Управление кредитными пакетами |
config | read, update | Системная конфигурация |
role | read | Просмотр ролей |
Middleware
Auth middleware дает два уровня защиты маршрутов:
sessionMiddleware - добавляет session в контекст (может быть пустым)
├── apiAuthMiddleware - требует входа (API routes, возвращает 401)
├── pageAuthMiddleware - требует входа (page routes, редирект на /login)
├── apiAdminMiddleware - требует роль администратора (API routes, возвращает 403)
└── pageAdminMiddleware - требует роль администратора (page routes, редирект на /404)Админ-мидлвары используют isUserAdmin(), чтобы проверить роль super_admin или admin.
Проверка прав
src/integrations/rabc/checker.ts содержит класс PermissionChecker для fine-grained проверки прав:
import { PermissionChecker } from "@/integrations/rabc/checker";
import { getUserPermissionRules } from "@/shared/model/rabc.model";
const rules = await getUserPermissionRules(userId);
const checker = new PermissionChecker(rules);
checker.can("read", "user"); // user:read, user:* или * подходят
checker.can("delete", "post"); // post:delete, post:* или * подходят
checker.cannot("grant", "credit"); // обратная проверка
checker.hasPermission("config:update"); // проверка по коду праваОсобенности:
- Wildcard matching -
*совпадает со всеми,resource:*совпадает со всеми действиями ресурса - Правила по условиям -
ownOnlyограничивает доступ только к собственным ресурсам,fieldsограничивает доступные поля - Приоритет allow - если хотя бы одна роль выдает право, доступ разрешен
CLI-утилиты
Управлять RBAC можно через командную строку:
pnpm rbac init # инициализировать роли и права
pnpm rbac init --force # принудительно сбросить роли и права
pnpm rbac assign -e admin@example.com -r super_admin # назначить роль
pnpm rbac assign -e user@example.com -r admin -d 30 # назначить роль на 30 дней
pnpm rbac revoke -e user@example.com -r admin # отозвать роль
pnpm rbac list-roles # список всех ролей
pnpm rbac list-permissions # список всех прав
pnpm rbac list-permissions -r user # фильтр по ресурсу
pnpm rbac list-user-roles -e admin@example.com # роли пользователя
pnpm rbac check -e admin@example.com -p user:delete # проверка праваТекущий статус
Интегрировано vs не интегрировано
Сейчас RBAC в проекте используется как защита маршрутов уровня администратора - все административные страницы и API проверяют роль super_admin или admin через middleware. Это покрывает самый частый сценарий.
Ниже перечислены функции, которые уже реализованы в коде, но не подключены к обработке маршрутов, и могут использоваться как строительные блоки:
- Fine-grained permission checks -
PermissionCheckerреализован, но не подключен ни к одному middleware или маршруту. Его можно использовать для логики доступа на уровне операций, например разрешить только определенной роли выполнятьorder:export. - Наследование ролей - в schema есть поле
inherits, но при запросе прав цепочка наследования не раскрывается. Если нужна иерархия ролей, это нужно реализовать вgetUserPermissionRules(). - Инвертированные правила - в schema есть флаг
invertedв стиле CASL (cannot), ноPermissionCheckerпока их игнорирует. Если нужны deny-правила, их надо добавить вручную. - Принудительная блокировка banned-ролей - роль
bannedсуществует, но ни один middleware ее не проверяет. Сейчас блокировка реализована через полеuser.bannedв базе.
Расширение RBAC
Чтобы добавить fine-grained permission checks в маршруты, можно создать собственный middleware:
import { createMiddleware } from "@tanstack/react-start";
import { PermissionChecker } from "@/integrations/rabc/checker";
import { getUserPermissionRules } from "@/shared/model/rabc.model";
import { Resp } from "@/shared/lib/tools/response";
import { apiAuthMiddleware } from "@/shared/middleware/auth.middleware";
export function requirePermission(resource: string, action: string) {
return createMiddleware()
.middleware([apiAuthMiddleware])
.server(async ({ next, context }) => {
const rules = await getUserPermissionRules(context.session.user.id);
const checker = new PermissionChecker(rules);
if (checker.cannot(action, resource)) {
return Resp.error("Forbidden", 403);
}
return await next();
});
}Использование в маршруте:
const authMiddleware = requirePermission("user", "delete");
export const Route = createAPIFileRoute("/api/admin/users/$id")({
DELETE: async ({ params }) => {
// Сюда попадут только пользователи с правом user:delete
},
middleware: [authMiddleware],
});Связанные файлы
| Файл | Описание |
|---|---|
src/db/rbac.schema.ts | database schema (permission, role, role_permission, user_role) |
src/shared/model/rabc.model.ts | функции модели (запрос ролей, назначение, проверка админов) |
src/integrations/rabc/checker.ts | класс PermissionChecker |
src/shared/middleware/auth.middleware.ts | middleware для аутентификации и админов |
scripts/rbac.ts | CLI-утилита |