Документация

Управление 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 и соответствуют реальным функциям панели:

РесурсДействиеОписание
userread, ban, grant-credit, manage-roleУправление пользователями
orderreadПросмотр заказов
credit-packageread, create, update, deleteУправление кредитными пакетами
configread, updateСистемная конфигурация
rolereadПросмотр ролей

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.tsdatabase schema (permission, role, role_permission, user_role)
src/shared/model/rabc.model.tsфункции модели (запрос ролей, назначение, проверка админов)
src/integrations/rabc/checker.tsкласс PermissionChecker
src/shared/middleware/auth.middleware.tsmiddleware для аутентификации и админов
scripts/rbac.tsCLI-утилита

Содержание