Added Role Owner and new UI for Owner
This commit is contained in:
733
OWNER_PERMISSIONS.md
Normal file
733
OWNER_PERMISSIONS.md
Normal file
@@ -0,0 +1,733 @@
|
||||
# 👑 Роль Владельца и Система Управления Правами
|
||||
|
||||
**Дата:** 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
|
||||
|
||||
**Полный контроль над панелью!** 👑
|
||||
Reference in New Issue
Block a user