feat(auth): add sessionCanManageApiKeys function and update access control logic
CI / changes (push) Successful in 5s
CI / commitlint (push) Skipped
CI / openapi (push) Successful in 26s
CI / web (push) Successful in 53s
CI / go (push) Successful in 56s
CI / bird2 (push) Successful in 17s
CI / release (push) Successful in 4m2s
CI / changes (push) Successful in 5s
CI / commitlint (push) Skipped
CI / openapi (push) Successful in 26s
CI / web (push) Successful in 53s
CI / go (push) Successful in 56s
CI / bird2 (push) Successful in 17s
CI / release (push) Successful in 4m2s
Introduced the sessionCanManageApiKeys function to determine if a session can manage API keys based on role, permissions, and admin status. Updated the AccessComponent to utilize this new function for enabling/disabling API key management features. Enhanced documentation to reflect changes in API key management roles and permissions, including updates to the OpenAPI specification.
This commit is contained in:
+15
-11
@@ -60,14 +60,18 @@ opkey|01ARZ3NDEKTSV4RRFFQ69G5FAV|operator,nodekey|01ARZ3NDEKTSV4RRFFQ69G5FAV|nod
|
||||
|
||||
### Управление через API и UI
|
||||
|
||||
При подключённой БД operator может:
|
||||
При подключённой БД управлять ключами может:
|
||||
|
||||
- `GET|POST /v1/api-keys`, `GET|PATCH|DELETE /v1/api-keys/{id}`, `POST /v1/api-keys/{id}/rotate` — см. OpenAPI, тег **API keys**.
|
||||
- В веб-панели: **Права доступа** (`/access`) → блок «API-ключи» (только для роли `operator`). Токен для браузера — в **Настройки** (`/settings`).
|
||||
- API-ключ с ролью **`operator`**, или
|
||||
- portal JWT с **`is_admin`** / правом **`bgp:access:admin`** (админ auth-portal).
|
||||
|
||||
Эндпоинты: `GET|POST /v1/api-keys`, `GET|PATCH|DELETE /v1/api-keys/{id}`, `POST /v1/api-keys/{id}/rotate` — см. OpenAPI, тег **API keys**.
|
||||
|
||||
В веб-панели: **Права доступа** (`/access`) → блок «API-ключи». Токен для браузера (API-key gate) — в **Настройки** (`/settings`).
|
||||
|
||||
Полный токен возвращается **один раз** в ответе `201` (создание) и `200` (ротация). В списках — только `prefix` (первые 8 символов). В БД хранится SHA-256 токена, не plaintext.
|
||||
|
||||
`GET /v1/auth/session` — текущие `tenant_id` и `role` (для UI).
|
||||
`GET /v1/auth/session` — `tenant_id`, `kind` (`apikey`|`jwt`), для API-ключа — `role`; для JWT — `user_id`, `email`, `permissions`, `is_admin`.
|
||||
|
||||
### Роли
|
||||
|
||||
@@ -178,13 +182,13 @@ http://localhost:5173,http://127.0.0.1:5173,https://ui.example.com
|
||||
|
||||
## Краткая матрица (ориентир)
|
||||
|
||||
| Действие | viewer | editor | operator | node |
|
||||
|----------|--------|--------|----------|------|
|
||||
| GET модули, ревизии, peers, speakers | да | да | да | нет |
|
||||
| POST/PATCH/DELETE CRUD сущностей | нет | да | да | нет |
|
||||
| apply, rollback, PATCH settings | нет | нет | да | нет |
|
||||
| Управление API-ключами (`/v1/api-keys`) | нет | нет | да | нет |
|
||||
| bundle, latest revision, enroll | нет | нет | нет | да |
|
||||
| Действие | viewer | editor | operator | node | portal admin / `bgp:access:admin` |
|
||||
|----------|--------|--------|----------|------|-----------------------------------|
|
||||
| GET модули, ревизии, peers, speakers | да | да | да | нет | по permissions |
|
||||
| POST/PATCH/DELETE CRUD сущностей | нет | да | да | нет | по permissions |
|
||||
| apply, rollback, PATCH settings | нет | нет | да | нет | `bgp:operations:admin` |
|
||||
| Управление API-ключами (`/v1/api-keys`) | нет | нет | да | нет | да |
|
||||
| bundle, latest revision, enroll | нет | нет | нет | да | нет |
|
||||
|
||||
Точные проверки по каждому маршруту — в коде `internal/httpapi` и в схеме безопасности операций в OpenAPI.
|
||||
|
||||
|
||||
+21
-2
@@ -676,13 +676,32 @@ components:
|
||||
|
||||
AuthSession:
|
||||
type: object
|
||||
required: [tenant_id, role]
|
||||
required: [tenant_id, kind]
|
||||
properties:
|
||||
tenant_id:
|
||||
$ref: "#/components/schemas/ResourceId"
|
||||
kind:
|
||||
type: string
|
||||
enum: [apikey, jwt]
|
||||
description: apikey — Bearer API key; jwt — portal SSO token.
|
||||
role:
|
||||
type: string
|
||||
enum: [viewer, editor, operator, node]
|
||||
description: >
|
||||
API-key role (viewer|editor|operator|node). Empty string for portal JWT sessions.
|
||||
user_id:
|
||||
type: string
|
||||
description: JWT sub (portal sessions only).
|
||||
email:
|
||||
type: string
|
||||
description: JWT email claim (portal sessions only).
|
||||
permissions:
|
||||
type: array
|
||||
items:
|
||||
type: string
|
||||
description: JWT permissions (bgp:*); portal sessions only.
|
||||
is_admin:
|
||||
type: boolean
|
||||
description: Portal is_admin claim; grants all bgp permissions.
|
||||
|
||||
ApiKey:
|
||||
type: object
|
||||
|
||||
Reference in New Issue
Block a user