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