734 lines
19 KiB
Markdown
734 lines
19 KiB
Markdown
# 👑 Роль Владельца и Система Управления Правами
|
||
|
||
**Дата:** 15 января 2026
|
||
**Версия:** 1.1.0
|
||
|
||
---
|
||
|
||
## 📋 Содержание
|
||
|
||
1. [Обзор](#обзор)
|
||
2. [Роль Владельца](#роль-владельца)
|
||
3. [Система Прав](#система-прав)
|
||
4. [API Эндпоинты](#api-эндпоинты)
|
||
5. [Примеры Использования](#примеры-использования)
|
||
6. [Миграция Существующих Пользователей](#миграция-существующих-пользователей)
|
||
|
||
---
|
||
|
||
## Обзор
|
||
|
||
В MC Panel добавлена роль **Владелец (Owner)** с расширенными возможностями управления правами пользователей. Владелец может:
|
||
|
||
- ✅ Изменять роли пользователей (admin, user, support, banned)
|
||
- ✅ Управлять правами доступа к ресурсам
|
||
- ✅ Забирать доступ к серверам, тикетам, файлам
|
||
- ✅ Выдавать доступ к ресурсам
|
||
- ✅ Удалять пользователей
|
||
- ✅ Полный контроль над панелью
|
||
|
||
---
|
||
|
||
## Роль Владельца
|
||
|
||
### Как стать владельцем?
|
||
|
||
**Первый зарегистрированный пользователь автоматически получает роль владельца.**
|
||
|
||
```json
|
||
{
|
||
"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 |
|
||
|------------|-------|-------|---------|------|--------|
|
||
| Управление пользователями | ✅ | ✅ | ❌ | ❌ | ❌ |
|
||
| Изменение ролей | ✅ | ❌ | ❌ | ❌ | ❌ |
|
||
| Удаление пользователей | ✅ | ❌ | ❌ | ❌ | ❌ |
|
||
| Управление всеми серверами | ✅ | ✅ | ❌ | ❌ | ❌ |
|
||
| Управление своими серверами | ✅ | ✅ | ✅ | ✅ | ❌ |
|
||
| Просмотр всех тикетов | ✅ | ✅ | ✅ | ❌ | ❌ |
|
||
| Ответ на тикеты | ✅ | ✅ | ✅ | ✅ | ❌ |
|
||
| Создание тикетов | ✅ | ✅ | ✅ | ✅ | ❌ |
|
||
| Доступ к панели | ✅ | ✅ | ✅ | ✅ | ❌ |
|
||
|
||
---
|
||
|
||
## Система Прав
|
||
|
||
### Структура прав пользователя
|
||
|
||
```json
|
||
{
|
||
"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. Получить список пользователей
|
||
|
||
```http
|
||
GET /api/users
|
||
Authorization: Bearer <token>
|
||
```
|
||
|
||
**Требуется роль:** Owner или Admin
|
||
|
||
**Ответ:**
|
||
```json
|
||
{
|
||
"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. Изменить роль пользователя
|
||
|
||
```http
|
||
PUT /api/users/{user_id}/role
|
||
Authorization: Bearer <token>
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"role": "admin"
|
||
}
|
||
```
|
||
|
||
**Требуется роль:** Owner
|
||
|
||
**Доступные роли:**
|
||
- `owner` (только один владелец)
|
||
- `admin`
|
||
- `support`
|
||
- `user`
|
||
- `banned`
|
||
|
||
**Ответ:**
|
||
```json
|
||
{
|
||
"message": "Роль пользователя изменена",
|
||
"user": {
|
||
"id": 2,
|
||
"username": "User1",
|
||
"role": "admin"
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 3. Изменить права пользователя
|
||
|
||
```http
|
||
PUT /api/users/{user_id}/permissions
|
||
Authorization: Bearer <token>
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"permissions": {
|
||
"manage_servers": true,
|
||
"manage_tickets": true,
|
||
"manage_files": false
|
||
}
|
||
}
|
||
```
|
||
|
||
**Требуется роль:** Owner
|
||
|
||
**Ответ:**
|
||
```json
|
||
{
|
||
"message": "Права пользователя обновлены",
|
||
"permissions": {
|
||
"manage_servers": true,
|
||
"manage_tickets": true,
|
||
"manage_files": false
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 4. Управление доступом к ресурсам
|
||
|
||
#### Выдать доступ к серверу
|
||
|
||
```http
|
||
POST /api/users/{user_id}/access/servers
|
||
Authorization: Bearer <token>
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"server_name": "Survival"
|
||
}
|
||
```
|
||
|
||
**Требуется роль:** Owner или Admin
|
||
|
||
**Ответ:**
|
||
```json
|
||
{
|
||
"message": "Доступ к серверу выдан",
|
||
"server": "Survival",
|
||
"user": "User1"
|
||
}
|
||
```
|
||
|
||
#### Забрать доступ к серверу
|
||
|
||
```http
|
||
DELETE /api/users/{user_id}/access/servers/{server_name}
|
||
Authorization: Bearer <token>
|
||
```
|
||
|
||
**Требуется роль:** Owner или Admin
|
||
|
||
**Ответ:**
|
||
```json
|
||
{
|
||
"message": "Доступ к серверу отозван",
|
||
"server": "Survival",
|
||
"user": "User1"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 5. Удалить пользователя
|
||
|
||
```http
|
||
DELETE /api/users/{user_id}
|
||
Authorization: Bearer <token>
|
||
```
|
||
|
||
**Требуется роль:** Owner
|
||
|
||
**Ответ:**
|
||
```json
|
||
{
|
||
"message": "Пользователь удалён",
|
||
"username": "User1"
|
||
}
|
||
```
|
||
|
||
**Примечание:** Владельца удалить нельзя!
|
||
|
||
---
|
||
|
||
### 6. Заблокировать пользователя
|
||
|
||
```http
|
||
POST /api/users/{user_id}/ban
|
||
Authorization: Bearer <token>
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"reason": "Нарушение правил"
|
||
}
|
||
```
|
||
|
||
**Требуется роль:** Owner или Admin
|
||
|
||
**Ответ:**
|
||
```json
|
||
{
|
||
"message": "Пользователь заблокирован",
|
||
"username": "User1",
|
||
"reason": "Нарушение правил"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 7. Разблокировать пользователя
|
||
|
||
```http
|
||
POST /api/users/{user_id}/unban
|
||
Authorization: Bearer <token>
|
||
```
|
||
|
||
**Требуется роль:** Owner или Admin
|
||
|
||
**Ответ:**
|
||
```json
|
||
{
|
||
"message": "Пользователь разблокирован",
|
||
"username": "User1"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## Примеры Использования
|
||
|
||
### Python
|
||
|
||
```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
|
||
|
||
```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
|
||
|
||
```bash
|
||
# Токен владельца
|
||
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. Всем пользователям добавляются права по умолчанию
|
||
|
||
### Скрипт миграции
|
||
|
||
```python
|
||
# 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()
|
||
```
|
||
|
||
**Запуск миграции:**
|
||
```bash
|
||
cd backend
|
||
python migrate_users.py
|
||
```
|
||
|
||
---
|
||
|
||
## UI Компоненты
|
||
|
||
### Панель управления пользователями
|
||
|
||
В панели администратора добавлен раздел "Управление пользователями" (только для Owner):
|
||
|
||
**Возможности:**
|
||
- Просмотр списка всех пользователей
|
||
- Изменение ролей
|
||
- Управление правами
|
||
- Выдача/отзыв доступа к ресурсам
|
||
- Блокировка/разблокировка
|
||
- Удаление пользователей
|
||
|
||
**Компонент:** `frontend/src/components/UserManagement.jsx`
|
||
|
||
---
|
||
|
||
## Безопасность
|
||
|
||
### Проверка прав
|
||
|
||
Все эндпоинты управления пользователями защищены:
|
||
|
||
```python
|
||
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="Требуется роль администратора или владельца"
|
||
)
|
||
```
|
||
|
||
### Логирование действий
|
||
|
||
Все действия владельца логируются:
|
||
|
||
```python
|
||
# Пример лога
|
||
{
|
||
"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`.
|
||
|
||
### Может ли владелец удалить сам себя?
|
||
|
||
Нет, владельца удалить нельзя. Сначала нужно передать роль владельца другому пользователю.
|
||
|
||
### Как передать роль владельца?
|
||
|
||
```bash
|
||
# Через 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
|
||
|
||
**Полный контроль над панелью!** 👑
|