Admin Gateway Service
Назначение
Admin Gateway — HTTP-шлюз для административного интерфейса платформы Univex. Обслуживает запросы сотрудников биржи: управление пользователями, ручные операции, AML-проверки, управление активами, P2P-диспуты и настройка конфигурации.
Фреймворк: Fiber v2. Авторизация: JWT + Casbin RBAC. Документация API: Swagger (OpenAPI).
Архитектура
┌────────────────────────────────────────────────┐
│ Fiber v2 HTTP Server │
│ JWT Middleware (проверка admin access-токена) │
│ Casbin RBAC Middleware (проверка прав) │
│ Swagger UI (/docs) │
└───────────────────────┬────────────────────────┘
│
┌─────────────┼──────────────┐
│ │ │
┌─────────▼──────┐ ┌────▼────┐ ┌──────▼──────┐
│ univex-id │ │ ledger │ │ p2p │
│ gRPC client │ │ gRPC │ │ gRPC client│
└────────────────┘ └─────────┘ └─────────────┘
│
┌─────────▼──────────────┐
│ exchange-integration │
│ gRPC client │
└────────────────────────┘
Casbin RBAC
Права доступа к маршрутам определяются политиками Casbin. Каждый администратор имеет роль (или набор ролей), роли определяют доступ к конкретным группам маршрутов.
| Роль |
Основные права |
CASHIER |
Фиатные операции, управление фиатными кассами |
OPERATOR |
Ручные операции с балансами |
P2P_ARBITRATOR |
P2P-диспуты |
SUPPORT_STAFF |
Просмотр аккаунтов, транзакций |
ADMINISTRATOR |
Большинство административных операций |
OWNER |
Полный доступ, управление администраторами |
Ролевая модель (Casbin RBAC)
Модель RBAC
Casbin использует следующую конфигурацию модели:
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
[role_definition]
g = _, _
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = g(r.sub, "OWNER") || g(r.sub, r.sub) && g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act
Матчер даёт роли OWNER безусловный доступ ко всем ресурсам (bypass на уровне матчера). Для всех остальных ролей проверяется тройка (sub, obj, act) по загруженным политикам.
Роли и наследование
| Роль |
Наследует |
Назначение |
CASHIER |
— |
Фиатные операции (READ, WRITE) |
OPERATOR |
— |
Просмотр пользователей + фиатные операции |
P2P_ARBITRATOR |
— |
Просмотр пользователей + P2P (READ, WRITE) |
ADMINISTRATOR |
CASHIER, OPERATOR, P2P_ARBITRATOR |
Полный доступ ко всем ресурсам |
OWNER |
— (hardcoded bypass) |
Безусловный доступ ко всему (bypass в matcher) |
Ресурсы
Защищённые ресурсы (20 единиц):
ADMIN_PROFILE, ADMIN_ROLE, ADMIN_SESSIONS, ASSETS, CRYPTO_OPERATIONS, FIAT_OPERATIONS, HOTWALLETS, LIMITS, MANUAL_OPERATIONS, MANUAL_VERIFICATION, NOTIFICATIONS, P2P, POLICY, SETTINGS, TICKERS, TIERS, USERS, WALLETS, WITHDRAWAL
Действия
| Действие |
Описание |
READ |
Чтение данных (GET-запросы) |
WRITE |
Изменение данных (POST, PUT, PATCH-запросы) |
DELETE |
Удаление данных (DELETE-запросы) |
* |
Wildcard — все действия |
Хранение политик
Политики хранятся в PostgreSQL через GORM-адаптер Casbin. Начальная инициализация выполняется командой cmd/init_roles/, которая загружает политики из файла policies.csv в базу данных.
Механизм проверки
sequenceDiagram
participant Client as Клиент (Admin UI)
participant AGW as admin-gateway middleware
participant JWT as JWT Manager
participant UID as univex-id (gRPC)
participant CB as Casbin enforcer
Client->>AGW: HTTP-запрос (Authorization: Bearer <token>)
AGW->>JWT: Извлечь userID из JWT
JWT-->>AGW: userID
AGW->>AGW: CheckAccess(resource, action)
AGW->>UID: gRPC CheckAdminAccess(userID, resource, action)
UID->>CB: enforcer.Enforce(userID, resource, action)
CB-->>UID: true / false
UID-->>AGW: разрешено / запрещено
alt Доступ разрешён
AGW-->>Client: 200 OK
else Доступ запрещён
AGW-->>Client: 403 Forbidden
end
Привязка к маршрутам
Проверка прав выполняется на уровне каждого маршрута (per-endpoint):
| Маршрут |
Middleware |
GET /api/account/find |
CheckAccess(USERS, READ) |
POST /api/account/:id/ban |
CheckAccess(USERS, WRITE) |
POST /api/role/change |
CheckAccess(ADMIN_ROLE, WRITE) |
PATCH /api/assets/ |
CheckAccess(ASSETS, WRITE) |
HTTP-маршруты
/auth — Аутентификация администраторов
| Метод |
Путь |
Описание |
POST |
/auth/sign-in |
Вход администратора по учётным данным |
POST |
/auth/refresh |
Обновление access-токена |
POST |
/auth/totp/create |
Инициировать привязку TOTP |
POST |
/auth/totp/complete |
Завершить привязку TOTP |
/explorer — Конфигурация эксплорера
| Метод |
Путь |
Описание |
GET |
/explorer |
Получить настройки шаблона эксплорера |
PUT |
/explorer |
Обновить настройки шаблона эксплорера |
/account — Управление пользователями
| Метод |
Путь |
Описание |
GET |
/account |
Список пользователей с фильтрацией |
GET |
/account/:id |
Данные пользователя по ID |
POST |
/account/:id/ban |
Заблокировать аккаунт |
POST |
/account/:id/unban |
Разблокировать аккаунт |
GET |
/account/:id/ban-events |
История блокировок/разблокировок |
POST |
/account/:id/verification |
Установить статус KYC вручную |
GET |
/account/:id/notes |
Заметки о пользователе |
POST |
/account/:id/notes |
Добавить заметку о пользователе |
GET |
/account/:id/wallets |
Кошельки пользователя |
GET |
/account/:id/balances |
Балансы пользователя |
GET |
/account/:id/tier |
Торговый уровень пользователя |
POST |
/account/:id/tier |
Изменить торговый уровень |
/admin — Профиль и управление администраторами
| Метод |
Путь |
Описание |
GET |
/admin/profile |
Профиль текущего администратора |
GET |
/admin/sessions |
Список активных административных сессий |
DELETE |
/admin/sessions/:id |
Отозвать административную сессию |
GET |
/admin |
Список администраторов |
POST |
/admin |
Создать нового администратора |
DELETE |
/admin/:id |
Удалить администратора |
GET |
/admin/actions |
Лог административных действий |
/role — Управление ролями
| Метод |
Путь |
Описание |
GET |
/role |
Список ролей |
POST |
/role |
Создать роль |
PUT |
/role/:id |
Изменить роль администратора |
/tiers — Торговые уровни
| Метод |
Путь |
Описание |
GET |
/tiers |
Список торговых уровней |
POST |
/tiers |
Создать торговый уровень |
GET |
/tiers/:id |
Данные торгового уровня |
PUT |
/tiers/:id |
Обновить торговый уровень |
/operations — Ручные операции
| Метод |
Путь |
Описание |
POST |
/operations/topup |
Ручное пополнение торгового баланса |
POST |
/operations/withdraw |
Ручной вывод с торгового баланса |
POST |
/operations/transfer |
Перевод между торговыми аккаунтами |
POST |
/operations/balance/topup |
Ручное пополнение балансового аккаунта |
POST |
/operations/balance/withdraw |
Ручное снятие с балансового аккаунта |
POST |
/operations/balance/transfer |
Перевод между балансовыми аккаунтами |
GET |
/operations/limits |
Лимиты на операции |
PUT |
/operations/limits |
Установить лимиты на операции |
/orders — Управление P2P-ордерами
| Метод |
Путь |
Описание |
GET |
/orders |
Список P2P-ордеров с фильтрацией |
GET |
/orders/:id |
Данные ордера |
GET |
/orders/:id/events |
История событий ордера |
/manual-verification — Ручная верификация
| Метод |
Путь |
Описание |
GET |
/manual-verification |
Список заявок на ручную верификацию |
POST |
/manual-verification/:id/approve |
Подтвердить верификацию |
POST |
/manual-verification/:id/reject |
Отклонить верификацию |
/p2p — P2P-диспуты
| Метод |
Путь |
Описание |
GET |
/p2p/disputes |
Список диспутов |
GET |
/p2p/disputes/:id |
Данные диспута |
POST |
/p2p/disputes/:id/accept |
Принять диспут в работу |
POST |
/p2p/disputes/:id/decision |
Вынести решение по диспуту |
/fiat — Фиатные операции
| Метод |
Путь |
Описание |
GET |
/fiat/bids |
Список фиатных заявок |
GET |
/fiat/bids/:id |
Данные фиатной заявки |
POST |
/fiat/bids/:id/process |
Принять фиатную заявку в обработку |
POST |
/fiat/bids/:id/complete |
Завершить фиатную заявку |
POST |
/fiat/bids/:id/funds-issued |
Подтвердить выдачу средств |
/notifications — Уведомления администраторов
| Метод |
Путь |
Описание |
GET |
/notifications |
Список уведомлений |
POST |
/notifications/:id/read |
Отметить уведомление прочитанным |
/confirm — Подтверждение операций
| Метод |
Путь |
Описание |
POST |
/confirm/:id |
Подтвердить операцию кодом 2FA |
GET |
/confirm/high-risk-withdrawals |
Список выводов с высоким риском, ожидающих подтверждения |
POST |
/confirm/high-risk-withdrawals/:id |
Подтвердить/отклонить рискованный вывод |
/hotwallets — Горячие кошельки
| Метод |
Путь |
Описание |
GET |
/hotwallets |
Список горячих кошельков |
POST |
/hotwallets/transfer |
Перевод активов между кошельками |
GET |
/hotwallets/transfer/:id/status |
Статус перевода активов |
/transit-wallets — Транзитные кошельки
| Метод |
Путь |
Описание |
GET |
/transit-wallets |
Список транзитных кошельков |
GET |
/transit-wallets/:id |
Данные транзитного кошелька |
POST |
/transit-wallets |
Создать транзитный кошелёк |
GET |
/transit-wallets/:id/topups |
История пополнений кошелька |
GET |
/transit-wallets/:id/withdrawals |
История выводов с кошелька |
POST |
/transit-wallets/:id/bypass-aml |
Пропустить AML-проверку пополнения |
/access — Управление доступом (Casbin)
| Метод |
Путь |
Описание |
GET |
/access/policies |
Список политик Casbin |
POST |
/access/policies |
Добавить политику |
DELETE |
/access/policies |
Удалить политику |
/frozen-assets — Замороженные активы
| Метод |
Путь |
Описание |
GET |
/frozen-assets |
Список замороженных активов |
POST |
/frozen-assets/freeze |
Заморозить активы |
POST |
/frozen-assets/unfreeze |
Разморозить активы |
POST |
/frozen-assets/spend |
Списать замороженные активы |
/fiat-places — Фиатные кассы
| Метод |
Путь |
Описание |
GET |
/fiat-places |
Список фиатных касс |
POST |
/fiat-places |
Создать фиатную кассу |
PUT |
/fiat-places/:id |
Обновить кассу |
DELETE |
/fiat-places/:id |
Удалить кассу |
/elliptic — Проверка рисков (Elliptic)
| Метод |
Путь |
Описание |
POST |
/elliptic/check |
Запустить проверку риска адреса через Elliptic |
GET |
/elliptic/:id |
Результат проверки риска |
/config — Конфигурация
| Метод |
Путь |
Описание |
POST |
/config/validate |
Валидировать конфигурацию биржевого движка |
/assets — Управление активами
| Метод |
Путь |
Описание |
GET |
/assets |
Список активов |
GET |
/assets/:asset/status |
Статус актива (торговля, пополнение, вывод) |
POST |
/assets/:asset/trading |
Включить/выключить торговлю активом |
POST |
/assets/:asset/networks/:network/topup |
Включить/выключить пополнение актива в сети |
POST |
/assets/:asset/networks/:network/withdraw |
Включить/выключить вывод актива в сети |
POST |
/assets/:asset/networks/:network/commission |
Установить комиссию на вывод |
/tickers — Управление тикерами
| Метод |
Путь |
Описание |
GET |
/tickers |
Список торговых пар |
POST |
/tickers/:ticker/trading |
Включить/выключить торговлю по паре |
/api-keys — Управление API-ключами пользователей
| Метод |
Путь |
Описание |
GET |
/api-keys/:account_id |
Список API-ключей пользователя |
DELETE |
/api-keys/:id |
Удалить API-ключ пользователя |
/blockchain — Управление выводами
| Метод |
Путь |
Описание |
GET |
/blockchain/withdraw-availability |
Статус доступности вывода для активов/сетей |
POST |
/blockchain/withdraw-availability |
Установить доступность вывода |
/risk-categories — Категории риска
| Метод |
Путь |
Описание |
GET |
/risk-categories |
Список категорий риска |
POST |
/risk-categories/:id/thresholds |
Установить пороги для категории |
POST |
/risk-categories/:id/rename |
Переименовать категорию |
DELETE |
/risk-categories |
Удалить категории риска |
GET |
/risk-categories/blacklist |
Список заблокированных адресов |
/transactions — Блокчейн-транзакции
| Метод |
Путь |
Описание |
GET |
/transactions |
Список блокчейн-транзакций |
GET |
/transactions/:id/hashes |
Хэши транзакций по выводу |
GET |
/transactions/topups |
Все пополнения |
GET |
/transactions/topups/:id |
Детали пополнения (AML-информация) |
GET |
/transactions/topups/:id/history |
История смены статусов пополнения |
/withdrawals — Управление выводами
| Метод |
Путь |
Описание |
GET |
/withdrawals |
Список выводов |
POST |
/withdrawals/:id/aml-clean |
Пометить вывод как прошедший AML |
POST |
/withdrawals/:id/aml-refund |
Инициировать возврат по AML |
POST |
/withdrawals/:id/refund-address |
Установить адрес возврата |
Middleware
| Middleware |
Назначение |
| JWT Auth |
Проверка и парсинг admin access-токена |
| Casbin RBAC |
Проверка прав доступа к конкретному маршруту по роли |
| Request Logger |
Логирование запросов с данными администратора |
| Error Handler |
Маппинг gRPC-кодов в HTTP-статусы |
| CORS |
Политика cross-origin для админ-интерфейса |
Конфигурация
| Параметр |
Описание |
HTTP_PORT |
Порт HTTP-сервера |
JWT_SECRET |
Секрет для верификации JWT |
CASBIN_MODEL_PATH |
Путь к файлу модели Casbin |
CASBIN_POLICY_PATH |
Путь к файлу политик Casbin (или DSN БД) |
UNIVEX_ID_GRPC_ADDR |
Адрес UnivexID gRPC |
LEDGER_GRPC_ADDR |
Адрес Ledger gRPC |
P2P_GRPC_ADDR |
Адрес P2P gRPC |
EXCHANGE_INTEGRATION_GRPC_ADDR |
Адрес Exchange Integration gRPC |
SWAGGER_ENABLED |
Включить/выключить Swagger UI |