Files
NeveTimePanel/OWNER_PERMISSIONS.md

734 lines
19 KiB
Markdown
Raw Blame History

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 Эндпоинты](#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
**Полный контроль над панелью!** 👑