432 lines
14 KiB
Markdown
432 lines
14 KiB
Markdown
# 👑 Несколько владельцев
|
||
|
||
**Дата:** 15 января 2026
|
||
**Статус:** РЕАЛИЗОВАНО ✅
|
||
|
||
---
|
||
|
||
## 🎯 Что изменилось
|
||
|
||
### До изменения
|
||
|
||
**Ограничение:** Мог быть только ОДИН владелец
|
||
|
||
```
|
||
❌ При назначении нового owner, старый owner автоматически становился admin
|
||
❌ Нельзя было удалить владельца
|
||
❌ Нельзя было заблокировать владельца
|
||
```
|
||
|
||
**Проблема:** Если нужно несколько администраторов с полными правами, приходилось использовать роль admin, у которой нет права изменять роли.
|
||
|
||
---
|
||
|
||
### После изменения
|
||
|
||
**Возможность:** Может быть НЕСКОЛЬКО владельцев
|
||
|
||
```
|
||
✅ Можно назначить несколько пользователей с ролью owner
|
||
✅ Можно удалить владельца (если их больше одного)
|
||
✅ Можно заблокировать владельца (если их больше одного)
|
||
✅ Всегда должен остаться хотя бы один владелец
|
||
```
|
||
|
||
**Преимущество:** Несколько человек могут иметь полный контроль над панелью.
|
||
|
||
---
|
||
|
||
## 📊 Новая логика
|
||
|
||
### Назначение владельца
|
||
|
||
**Было:**
|
||
```python
|
||
# Если назначается новый owner, текущий owner становится admin
|
||
if role_data.role == "owner":
|
||
for user in users.values():
|
||
if user.get("role") == "owner":
|
||
user["role"] = "admin" # Понижение роли
|
||
```
|
||
|
||
**Стало:**
|
||
```python
|
||
# Разрешаем несколько владельцев
|
||
# Просто назначаем роль без изменения других владельцев
|
||
users[username]["role"] = role_data.role
|
||
```
|
||
|
||
---
|
||
|
||
### Удаление владельца
|
||
|
||
**Было:**
|
||
```python
|
||
if users[username].get("role") == "owner":
|
||
raise HTTPException(400, "Нельзя удалить владельца")
|
||
```
|
||
|
||
**Стало:**
|
||
```python
|
||
if users[username].get("role") == "owner":
|
||
owners_count = sum(1 for u in users.values() if u.get("role") == "owner")
|
||
if owners_count <= 1:
|
||
raise HTTPException(400, "Нельзя удалить последнего владельца")
|
||
```
|
||
|
||
**Логика:**
|
||
- Если владельцев больше одного → можно удалить
|
||
- Если владелец последний → нельзя удалить
|
||
|
||
---
|
||
|
||
### Блокировка владельца
|
||
|
||
**Было:**
|
||
```python
|
||
if users[username].get("role") == "owner":
|
||
raise HTTPException(400, "Нельзя заблокировать владельца")
|
||
```
|
||
|
||
**Стало:**
|
||
```python
|
||
if users[username].get("role") == "owner":
|
||
owners_count = sum(1 for u in users.values() if u.get("role") == "owner")
|
||
if owners_count <= 1:
|
||
raise HTTPException(400, "Нельзя заблокировать последнего владельца")
|
||
```
|
||
|
||
**Логика:**
|
||
- Если владельцев больше одного → можно заблокировать
|
||
- Если владелец последний → нельзя заблокировать
|
||
|
||
---
|
||
|
||
## 💡 Примеры использования
|
||
|
||
### Сценарий 1: Назначить второго владельца
|
||
|
||
**Текущее состояние:**
|
||
```json
|
||
{
|
||
"Root": {"role": "owner"},
|
||
"Admin1": {"role": "admin"}
|
||
}
|
||
```
|
||
|
||
**Действие:** Назначить Admin1 владельцем
|
||
|
||
**Результат:**
|
||
```json
|
||
{
|
||
"Root": {"role": "owner"},
|
||
"Admin1": {"role": "owner"} // Теперь тоже владелец!
|
||
}
|
||
```
|
||
|
||
**Оба пользователя имеют полные права!** ✅
|
||
|
||
---
|
||
|
||
### Сценарий 2: Удалить одного из владельцев
|
||
|
||
**Текущее состояние:**
|
||
```json
|
||
{
|
||
"Root": {"role": "owner"},
|
||
"Admin1": {"role": "owner"},
|
||
"User1": {"role": "user"}
|
||
}
|
||
```
|
||
|
||
**Действие:** Удалить Admin1
|
||
|
||
**Результат:**
|
||
```json
|
||
{
|
||
"Root": {"role": "owner"},
|
||
"User1": {"role": "user"}
|
||
}
|
||
```
|
||
|
||
**Успешно!** Root остался владельцем ✅
|
||
|
||
---
|
||
|
||
### Сценарий 3: Попытка удалить последнего владельца
|
||
|
||
**Текущее состояние:**
|
||
```json
|
||
{
|
||
"Root": {"role": "owner"},
|
||
"User1": {"role": "user"}
|
||
}
|
||
```
|
||
|
||
**Действие:** Удалить Root
|
||
|
||
**Результат:**
|
||
```
|
||
❌ Ошибка: "Нельзя удалить последнего владельца. Должен остаться хотя бы один владелец."
|
||
```
|
||
|
||
**Защита от потери контроля!** 🔒
|
||
|
||
---
|
||
|
||
### Сценарий 4: Три владельца
|
||
|
||
**Возможно:**
|
||
```json
|
||
{
|
||
"Root": {"role": "owner"},
|
||
"Admin1": {"role": "owner"},
|
||
"Admin2": {"role": "owner"},
|
||
"User1": {"role": "user"}
|
||
}
|
||
```
|
||
|
||
**Все три владельца имеют:**
|
||
- ✅ Управление пользователями
|
||
- ✅ Изменение ролей
|
||
- ✅ Удаление пользователей
|
||
- ✅ Просмотр всех ресурсов
|
||
- ✅ Все права
|
||
|
||
---
|
||
|
||
## 🎯 Как использовать
|
||
|
||
### Назначить нового владельца
|
||
|
||
1. Войдите как владелец
|
||
2. Нажмите "Управление"
|
||
3. Найдите пользователя
|
||
4. Нажмите "Роль"
|
||
5. Выберите "Владелец"
|
||
6. Готово! Теперь два владельца
|
||
|
||
### Понизить владельца до админа
|
||
|
||
1. Войдите как владелец
|
||
2. Нажмите "Управление"
|
||
3. Найдите другого владельца
|
||
4. Нажмите "Роль"
|
||
5. Выберите "Администратор"
|
||
6. Владелец понижен до админа
|
||
|
||
### Удалить владельца
|
||
|
||
1. Убедитесь что владельцев больше одного
|
||
2. Войдите как владелец
|
||
3. Нажмите "Управление"
|
||
4. Найдите владельца для удаления
|
||
5. Нажмите кнопку удаления (красная)
|
||
6. Подтвердите
|
||
7. Владелец удалён (если их было больше одного)
|
||
|
||
---
|
||
|
||
## 🔒 Правила безопасности
|
||
|
||
### Что НЕЛЬЗЯ сделать:
|
||
|
||
- ❌ Удалить последнего владельца
|
||
- ❌ Заблокировать последнего владельца
|
||
- ❌ Изменить свою роль
|
||
- ❌ Удалить самого себя
|
||
- ❌ Заблокировать самого себя
|
||
|
||
### Что МОЖНО:
|
||
|
||
- ✅ Назначить несколько владельцев
|
||
- ✅ Удалить владельца (если их больше одного)
|
||
- ✅ Заблокировать владельца (если их больше одного)
|
||
- ✅ Понизить владельца до админа
|
||
- ✅ Повысить админа до владельца
|
||
|
||
---
|
||
|
||
## 📊 Сравнение ролей
|
||
|
||
### Owner (Владелец) - Несколько человек ✅
|
||
|
||
**Права:**
|
||
- ✅ Управление пользователями
|
||
- ✅ Изменение ролей (включая назначение других владельцев)
|
||
- ✅ Удаление пользователей
|
||
- ✅ Управление серверами
|
||
- ✅ Просмотр всех ресурсов
|
||
- ✅ Все права
|
||
|
||
**Ограничения:**
|
||
- Должен быть хотя бы один владелец
|
||
- Нельзя удалить/заблокировать себя
|
||
|
||
### Admin (Администратор) - Несколько человек ✅
|
||
|
||
**Права:**
|
||
- ✅ Управление пользователями
|
||
- ✅ Управление серверами
|
||
- ✅ Просмотр всех ресурсов
|
||
- ❌ Изменение ролей
|
||
- ❌ Удаление пользователей
|
||
|
||
**Отличие от Owner:**
|
||
- Не может назначать владельцев
|
||
- Не может удалять пользователей
|
||
|
||
---
|
||
|
||
## 🎨 UI изменения
|
||
|
||
### Модальное окно изменения роли
|
||
|
||
Теперь при выборе "Владелец" не будет предупреждения о понижении текущего владельца:
|
||
|
||
```
|
||
┌─────────────────────────────────┐
|
||
│ Изменить роль: Admin1 │
|
||
├─────────────────────────────────┤
|
||
│ [👑 Владелец] │
|
||
│ Полный контроль над панелью │
|
||
│ ⚠️ Может быть несколько │ ← Новое
|
||
│ │
|
||
│ [🛡️ Администратор] ← Текущая │
|
||
│ Управление без изменения │
|
||
│ ролей │
|
||
│ │
|
||
│ [Отмена] │
|
||
└─────────────────────────────────┘
|
||
```
|
||
|
||
### Список пользователей
|
||
|
||
Теперь может быть несколько пользователей с меткой "👑 Владелец":
|
||
|
||
```
|
||
1. Root [👑 Владелец]
|
||
2. Admin1 [👑 Владелец] ← Новое
|
||
3. Admin2 [🛡️ Админ]
|
||
4. User1 [✅ Пользователь]
|
||
```
|
||
|
||
---
|
||
|
||
## 🔧 Технические детали
|
||
|
||
### Изменённые файлы
|
||
|
||
**Файл:** `backend/main.py`
|
||
|
||
**Изменённые эндпоинты:**
|
||
1. `PUT /api/users/{username}/role` - Убрано автоматическое понижение
|
||
2. `DELETE /api/users/{username}` - Добавлена проверка количества владельцев
|
||
3. `POST /api/users/{username}/ban` - Добавлена проверка количества владельцев
|
||
|
||
**Добавленная логика:**
|
||
```python
|
||
# Подсчёт владельцев
|
||
owners_count = sum(1 for u in users.values() if u.get("role") == "owner")
|
||
|
||
# Проверка перед удалением/блокировкой
|
||
if owners_count <= 1:
|
||
raise HTTPException(400, "Нельзя удалить/заблокировать последнего владельца")
|
||
```
|
||
|
||
---
|
||
|
||
## 🎯 Рекомендации
|
||
|
||
### Когда использовать несколько владельцев
|
||
|
||
**Хорошие случаи:**
|
||
- ✅ Несколько администраторов проекта
|
||
- ✅ Команда разработчиков
|
||
- ✅ Резервный владелец на случай отсутствия основного
|
||
- ✅ Разделение ответственности
|
||
|
||
**Плохие случаи:**
|
||
- ❌ Слишком много владельцев (риск безопасности)
|
||
- ❌ Назначение владельцем ненадёжных пользователей
|
||
- ❌ Владелец "на пробу"
|
||
|
||
### Рекомендуемая структура
|
||
|
||
```
|
||
👑 Owner (2-3 человека) - Основные администраторы
|
||
↓
|
||
🛡️ Admin (3-5 человек) - Помощники администраторов
|
||
↓
|
||
💬 Support (5-10 человек) - Техническая поддержка
|
||
↓
|
||
✅ User (неограниченно) - Обычные пользователи
|
||
```
|
||
|
||
---
|
||
|
||
## 🚀 Перезапуск
|
||
|
||
После изменений перезапустите панель:
|
||
|
||
```bash
|
||
RESTART_ALL.bat
|
||
```
|
||
|
||
Или вручную:
|
||
```bash
|
||
cd backend
|
||
python main.py
|
||
```
|
||
|
||
---
|
||
|
||
## ✅ Проверка
|
||
|
||
### Тест 1: Назначить второго владельца
|
||
|
||
1. Войдите как Root
|
||
2. Управление → MihailPrud → Роль → Владелец
|
||
3. Проверьте что оба имеют роль owner
|
||
|
||
### Тест 2: Попытка удалить единственного владельца
|
||
|
||
1. Понизьте всех владельцев кроме одного
|
||
2. Попытайтесь удалить последнего
|
||
3. Должна быть ошибка
|
||
|
||
### Тест 3: Удаление одного из нескольких владельцев
|
||
|
||
1. Назначьте двух владельцев
|
||
2. Удалите одного
|
||
3. Должно пройти успешно
|
||
|
||
---
|
||
|
||
## 🎉 Итог
|
||
|
||
**Теперь можно иметь несколько владельцев!** ✅
|
||
|
||
### Преимущества:
|
||
|
||
- ✅ Гибкость в управлении
|
||
- ✅ Резервирование доступа
|
||
- ✅ Разделение ответственности
|
||
- ✅ Защита от потери контроля (всегда остаётся хотя бы один владелец)
|
||
|
||
### Безопасность:
|
||
|
||
- 🔒 Нельзя удалить последнего владельца
|
||
- 🔒 Нельзя заблокировать последнего владельца
|
||
- 🔒 Нельзя изменить свою роль
|
||
- 🔒 Нельзя удалить себя
|
||
|
||
---
|
||
|
||
**Версия:** 1.1.0
|
||
**Дата:** 15 января 2026
|
||
**Статус:** РАБОТАЕТ ✅
|
||
|
||
**Несколько владельцев - больше контроля!** 👑👑👑
|
||
|