SECURITY: Ограничен доступ владельцев тенантов к админке Django
Исправлена критическая уязвимость безопасности, которая потенциально позволяла владельцам тенантов получить доступ к админ-панели Django. Изменения: - Добавлены явные setdefault для is_staff=False и is_superuser=False в CustomUserManager.create_user() - Добавлены явные флаги безопасности при создании владельца тенанта - Добавлены явные флаги безопасности при создании пользователей через систему ролей - Создан TenantAdminAccessMiddleware для защиты /admin/ на уровне middleware - Создана миграция данных для исправления флагов у существующих пользователей Реализована трёхуровневая защита (Defense-in-Depth): 1. Уровень модели: явные дефолты в create_user() 2. Уровень views: явные флаги при создании 3. Уровень middleware: runtime блокировка доступа Файлы: - accounts/models.py: явные флаги в create_user() - tenants/admin.py: явные флаги при создании владельца - user_roles/views.py: явные флаги при создании через роли - myproject/admin_access_middleware.py: новый middleware - myproject/settings.py: регистрация middleware - accounts/migrations/0002_fix_owner_staff_flags.py: миграция данных ВАЖНО: После применения этого коммита необходимо выполнить: 1. python manage.py migrate accounts 2. python manage.py migrate_schemas 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -11,6 +11,12 @@ class CustomUserManager(BaseUserManager):
|
||||
email = self.normalize_email(email)
|
||||
# Generate a unique username based on email to satisfy the AbstractUser constraint
|
||||
username = email
|
||||
|
||||
# SECURITY FIX: Явно устанавливаем флаги безопасности в False по умолчанию
|
||||
# Обычные пользователи НЕ должны иметь доступ к админке
|
||||
extra_fields.setdefault('is_staff', False)
|
||||
extra_fields.setdefault('is_superuser', False)
|
||||
|
||||
user = self.model(email=email, name=name, username=username, **extra_fields)
|
||||
user.set_password(password)
|
||||
user.save(using=self._db)
|
||||
|
||||
Reference in New Issue
Block a user