Change drone.yml
This commit is contained in:
431
MULTIPLE_OWNERS.md
Normal file
431
MULTIPLE_OWNERS.md
Normal file
@@ -0,0 +1,431 @@
|
||||
# 👑 Несколько владельцев
|
||||
|
||||
**Дата:** 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
|
||||
**Статус:** РАБОТАЕТ ✅
|
||||
|
||||
**Несколько владельцев - больше контроля!** 👑👑👑
|
||||
|
||||
Reference in New Issue
Block a user