Clone
1
Owner Permissions
Arkon edited this page 2026-01-15 20:32:46 +07:00
This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

👑 Роль Владельца и Система Управления Правами

Дата: 15 января 2026
Версия: 1.1.0


📋 Содержание

  1. Обзор
  2. Роль Владельца
  3. Система Прав
  4. API Эндпоинты
  5. Примеры Использования
  6. Миграция Существующих Пользователей

Обзор

В MC Panel добавлена роль Владелец (Owner) с расширенными возможностями управления правами пользователей. Владелец может:

  • Изменять роли пользователей (admin, user, support, banned)
  • Управлять правами доступа к ресурсам
  • Забирать доступ к серверам, тикетам, файлам
  • Выдавать доступ к ресурсам
  • Удалять пользователей
  • Полный контроль над панелью

Роль Владельца

Как стать владельцем?

Первый зарегистрированный пользователь автоматически получает роль владельца.

{
  "username": "Root",
  "role": "owner",
  "permissions": {
    "manage_users": true,
    "manage_roles": true,
    "manage_servers": true,
    "manage_tickets": true,
    "manage_files": true,
    "delete_users": true,
    "view_all_resources": true
  }
}

Иерархия ролей

Owner (Владелец)
  ↓
Admin (Администратор)
  ↓
Support (Поддержка)
  ↓
User (Пользователь)
  ↓
Banned (Заблокирован)

Возможности по ролям

Возможность Owner Admin Support User Banned
Управление пользователями
Изменение ролей
Удаление пользователей
Управление всеми серверами
Управление своими серверами
Просмотр всех тикетов
Ответ на тикеты
Создание тикетов
Доступ к панели

Система Прав

Структура прав пользователя

{
  "username": "example_user",
  "role": "user",
  "permissions": {
    "manage_users": false,
    "manage_roles": false,
    "manage_servers": true,
    "manage_tickets": true,
    "manage_files": true,
    "delete_users": false,
    "view_all_resources": false
  },
  "resource_access": {
    "servers": ["server1", "server2"],
    "tickets": ["ticket1", "ticket2"],
    "files": ["server1/*", "server2/*"]
  }
}

Типы прав

1. manage_users

  • Создание пользователей
  • Редактирование профилей
  • Просмотр списка пользователей

2. manage_roles

  • Изменение ролей пользователей
  • Только для Owner

3. manage_servers

  • Создание серверов
  • Запуск/остановка серверов
  • Удаление серверов

4. manage_tickets

  • Создание тикетов
  • Ответ на тикеты
  • Изменение статуса

5. manage_files

  • Загрузка файлов
  • Редактирование файлов
  • Удаление файлов

6. delete_users

  • Удаление пользователей
  • Только для Owner

7. view_all_resources

  • Просмотр всех серверов
  • Просмотр всех тикетов
  • Доступ ко всем файлам

API Эндпоинты

1. Получить список пользователей

GET /api/users
Authorization: Bearer <token>

Требуется роль: Owner или Admin

Ответ:

{
  "users": [
    {
      "id": 1,
      "username": "Root",
      "role": "owner",
      "created_at": "2026-01-15T10:00:00Z"
    },
    {
      "id": 2,
      "username": "User1",
      "role": "user",
      "created_at": "2026-01-15T11:00:00Z"
    }
  ]
}

2. Изменить роль пользователя

PUT /api/users/{user_id}/role
Authorization: Bearer <token>
Content-Type: application/json

{
  "role": "admin"
}

Требуется роль: Owner

Доступные роли:

  • owner (только один владелец)
  • admin
  • support
  • user
  • banned

Ответ:

{
  "message": "Роль пользователя изменена",
  "user": {
    "id": 2,
    "username": "User1",
    "role": "admin"
  }
}

3. Изменить права пользователя

PUT /api/users/{user_id}/permissions
Authorization: Bearer <token>
Content-Type: application/json

{
  "permissions": {
    "manage_servers": true,
    "manage_tickets": true,
    "manage_files": false
  }
}

Требуется роль: Owner

Ответ:

{
  "message": "Права пользователя обновлены",
  "permissions": {
    "manage_servers": true,
    "manage_tickets": true,
    "manage_files": false
  }
}

4. Управление доступом к ресурсам

Выдать доступ к серверу

POST /api/users/{user_id}/access/servers
Authorization: Bearer <token>
Content-Type: application/json

{
  "server_name": "Survival"
}

Требуется роль: Owner или Admin

Ответ:

{
  "message": "Доступ к серверу выдан",
  "server": "Survival",
  "user": "User1"
}

Забрать доступ к серверу

DELETE /api/users/{user_id}/access/servers/{server_name}
Authorization: Bearer <token>

Требуется роль: Owner или Admin

Ответ:

{
  "message": "Доступ к серверу отозван",
  "server": "Survival",
  "user": "User1"
}

5. Удалить пользователя

DELETE /api/users/{user_id}
Authorization: Bearer <token>

Требуется роль: Owner

Ответ:

{
  "message": "Пользователь удалён",
  "username": "User1"
}

Примечание: Владельца удалить нельзя!


6. Заблокировать пользователя

POST /api/users/{user_id}/ban
Authorization: Bearer <token>
Content-Type: application/json

{
  "reason": "Нарушение правил"
}

Требуется роль: Owner или Admin

Ответ:

{
  "message": "Пользователь заблокирован",
  "username": "User1",
  "reason": "Нарушение правил"
}

7. Разблокировать пользователя

POST /api/users/{user_id}/unban
Authorization: Bearer <token>

Требуется роль: Owner или Admin

Ответ:

{
  "message": "Пользователь разблокирован",
  "username": "User1"
}

Примеры Использования

Python

import requests

# Токен владельца
token = "your_owner_token"
headers = {"Authorization": f"Bearer {token}"}
base_url = "http://localhost:8000"

# 1. Получить список пользователей
response = requests.get(f"{base_url}/api/users", headers=headers)
users = response.json()["users"]
print(f"Всего пользователей: {len(users)}")

# 2. Изменить роль пользователя
user_id = 2
response = requests.put(
    f"{base_url}/api/users/{user_id}/role",
    headers=headers,
    json={"role": "admin"}
)
print(response.json()["message"])

# 3. Выдать доступ к серверу
response = requests.post(
    f"{base_url}/api/users/{user_id}/access/servers",
    headers=headers,
    json={"server_name": "Survival"}
)
print(response.json()["message"])

# 4. Заблокировать пользователя
response = requests.post(
    f"{base_url}/api/users/{user_id}/ban",
    headers=headers,
    json={"reason": "Нарушение правил"}
)
print(response.json()["message"])

# 5. Разблокировать пользователя
response = requests.post(
    f"{base_url}/api/users/{user_id}/unban",
    headers=headers
)
print(response.json()["message"])

# 6. Удалить пользователя
response = requests.delete(
    f"{base_url}/api/users/{user_id}",
    headers=headers
)
print(response.json()["message"])

JavaScript

const token = "your_owner_token";
const baseUrl = "http://localhost:8000";

// 1. Получить список пользователей
async function getUsers() {
  const response = await fetch(`${baseUrl}/api/users`, {
    headers: { "Authorization": `Bearer ${token}` }
  });
  const data = await response.json();
  console.log(`Всего пользователей: ${data.users.length}`);
}

// 2. Изменить роль пользователя
async function changeRole(userId, role) {
  const response = await fetch(`${baseUrl}/api/users/${userId}/role`, {
    method: "PUT",
    headers: {
      "Authorization": `Bearer ${token}`,
      "Content-Type": "application/json"
    },
    body: JSON.stringify({ role })
  });
  const data = await response.json();
  console.log(data.message);
}

// 3. Выдать доступ к серверу
async function grantServerAccess(userId, serverName) {
  const response = await fetch(`${baseUrl}/api/users/${userId}/access/servers`, {
    method: "POST",
    headers: {
      "Authorization": `Bearer ${token}`,
      "Content-Type": "application/json"
    },
    body: JSON.stringify({ server_name: serverName })
  });
  const data = await response.json();
  console.log(data.message);
}

// 4. Заблокировать пользователя
async function banUser(userId, reason) {
  const response = await fetch(`${baseUrl}/api/users/${userId}/ban`, {
    method: "POST",
    headers: {
      "Authorization": `Bearer ${token}`,
      "Content-Type": "application/json"
    },
    body: JSON.stringify({ reason })
  });
  const data = await response.json();
  console.log(data.message);
}

// Использование
getUsers();
changeRole(2, "admin");
grantServerAccess(2, "Survival");
banUser(2, "Нарушение правил");

cURL

# Токен владельца
TOKEN="your_owner_token"
BASE_URL="http://localhost:8000"

# 1. Получить список пользователей
curl -X GET "$BASE_URL/api/users" \
  -H "Authorization: Bearer $TOKEN"

# 2. Изменить роль пользователя
curl -X PUT "$BASE_URL/api/users/2/role" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"role": "admin"}'

# 3. Выдать доступ к серверу
curl -X POST "$BASE_URL/api/users/2/access/servers" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"server_name": "Survival"}'

# 4. Забрать доступ к серверу
curl -X DELETE "$BASE_URL/api/users/2/access/servers/Survival" \
  -H "Authorization: Bearer $TOKEN"

# 5. Заблокировать пользователя
curl -X POST "$BASE_URL/api/users/2/ban" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"reason": "Нарушение правил"}'

# 6. Разблокировать пользователя
curl -X POST "$BASE_URL/api/users/2/unban" \
  -H "Authorization: Bearer $TOKEN"

# 7. Удалить пользователя
curl -X DELETE "$BASE_URL/api/users/2" \
  -H "Authorization: Bearer $TOKEN"

Миграция Существующих Пользователей

Автоматическая миграция

При первом запуске обновлённой версии панели:

  1. Первый пользователь в users.json получает роль owner
  2. Все пользователи с ролью admin остаются admin
  3. Все остальные пользователи получают роль user
  4. Всем пользователям добавляются права по умолчанию

Скрипт миграции

# backend/migrate_users.py
import json
from pathlib import Path

def migrate_users():
    users_file = Path("users.json")
    
    if not users_file.exists():
        print("Файл users.json не найден")
        return
    
    with open(users_file, "r", encoding="utf-8") as f:
        users = json.load(f)
    
    if not users:
        print("Нет пользователей для миграции")
        return
    
    # Первый пользователь = owner
    users[0]["role"] = "owner"
    users[0]["permissions"] = {
        "manage_users": True,
        "manage_roles": True,
        "manage_servers": True,
        "manage_tickets": True,
        "manage_files": True,
        "delete_users": True,
        "view_all_resources": True
    }
    
    # Остальные пользователи
    for user in users[1:]:
        if "role" not in user:
            user["role"] = "user"
        
        if "permissions" not in user:
            if user["role"] == "admin":
                user["permissions"] = {
                    "manage_users": True,
                    "manage_roles": False,
                    "manage_servers": True,
                    "manage_tickets": True,
                    "manage_files": True,
                    "delete_users": False,
                    "view_all_resources": True
                }
            else:
                user["permissions"] = {
                    "manage_users": False,
                    "manage_roles": False,
                    "manage_servers": True,
                    "manage_tickets": True,
                    "manage_files": True,
                    "delete_users": False,
                    "view_all_resources": False
                }
        
        if "resource_access" not in user:
            user["resource_access"] = {
                "servers": [],
                "tickets": [],
                "files": []
            }
    
    # Сохранить
    with open(users_file, "w", encoding="utf-8") as f:
        json.dump(users, f, indent=2, ensure_ascii=False)
    
    print(f"Миграция завершена! Обновлено пользователей: {len(users)}")
    print(f"Владелец: {users[0]['username']}")

if __name__ == "__main__":
    migrate_users()

Запуск миграции:

cd backend
python migrate_users.py

UI Компоненты

Панель управления пользователями

В панели администратора добавлен раздел "Управление пользователями" (только для Owner):

Возможности:

  • Просмотр списка всех пользователей
  • Изменение ролей
  • Управление правами
  • Выдача/отзыв доступа к ресурсам
  • Блокировка/разблокировка
  • Удаление пользователей

Компонент: frontend/src/components/UserManagement.jsx


Безопасность

Проверка прав

Все эндпоинты управления пользователями защищены:

def require_owner(current_user: dict):
    if current_user["role"] != "owner":
        raise HTTPException(
            status_code=403,
            detail="Требуется роль владельца"
        )

def require_admin_or_owner(current_user: dict):
    if current_user["role"] not in ["owner", "admin"]:
        raise HTTPException(
            status_code=403,
            detail="Требуется роль администратора или владельца"
        )

Логирование действий

Все действия владельца логируются:

# Пример лога
{
  "timestamp": "2026-01-15T12:00:00Z",
  "action": "change_role",
  "owner": "Root",
  "target_user": "User1",
  "old_role": "user",
  "new_role": "admin"
}

FAQ

Можно ли иметь несколько владельцев?

Нет, владелец может быть только один. Но владелец может назначить несколько администраторов.

Что делать, если владелец потерял доступ?

Отредактируйте backend/users.json вручную и измените роль нужного пользователя на owner.

Может ли владелец удалить сам себя?

Нет, владельца удалить нельзя. Сначала нужно передать роль владельца другому пользователю.

Как передать роль владельца?

# Через API
curl -X PUT "http://localhost:8000/api/users/2/role" \
  -H "Authorization: Bearer $OWNER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"role": "owner"}'

При передаче роли владельца, текущий владелец автоматически становится администратором.


Changelog

Версия 1.1.0 (15 января 2026)

Добавлено:

  • Роль владельца (Owner)
  • Система прав и разрешений
  • API для управления пользователями
  • Управление доступом к ресурсам
  • Блокировка/разблокировка пользователей
  • Удаление пользователей
  • UI компонент управления пользователями
  • Скрипт миграции
  • Логирование действий

Изменено:

  • Первый пользователь теперь получает роль owner вместо admin
  • Добавлена проверка прав для всех эндпоинтов
  • Обновлена структура пользователя в users.json

Версия: 1.1.0
Дата: 15 января 2026

Полный контроль над панелью! 👑