Рефакторинг: убрана зависимость от Django Groups/Permissions для CustomUser

- CustomUser теперь наследуется от AbstractBaseUser (вместо AbstractUser)
- Удалены поля groups и user_permissions из CustomUser
- Все authentication backends (TenantUserBackend, PlatformAdminBackend, RoleBasedPermissionBackend) больше НЕ наследуются от ModelBackend
- Добавлены методы has_perm() и has_module_perms() в CustomUser для делегирования проверки прав кастомным backends
- Полная изоляция: CustomUser использует только систему ролей (UserRole), PlatformAdmin использует только is_superuser
- Удалён весь старый код, связанный с Django permissions
- Нет обратной совместимости (не требуется)
- Чистая архитектура для multi-tenant приложения
This commit is contained in:
2026-01-10 00:10:25 +03:00
parent d90b0162c5
commit b63162b1cb
5 changed files with 162 additions and 43 deletions

View File

@@ -4,15 +4,18 @@ Authentication backend для PlatformAdmin.
Этот backend используется для аутентификации администраторов платформы.
Работает на public домене, а также на tenant доменах для суперадминов.
ВАЖНО: НЕ наследуется от ModelBackend! Полностью независимая реализация.
"""
from django.contrib.auth.backends import ModelBackend
from django.db import connection
class PlatformAdminBackend(ModelBackend):
class PlatformAdminBackend:
"""
Backend аутентификации для PlatformAdmin.
НЕ наследуется от ModelBackend! Полностью независимая реализация.
Особенности:
- На public домене: аутентифицирует любого PlatformAdmin
- На tenant домене: аутентифицирует только PlatformAdmin с is_superuser=True
@@ -79,3 +82,40 @@ class PlatformAdminBackend(ModelBackend):
"""
is_active = getattr(user, 'is_active', None)
return is_active or is_active is None
def has_perm(self, user_obj, perm, obj=None):
"""
Проверка permissions для PlatformAdmin.
ВАЖНО: Этот backend работает ТОЛЬКО с PlatformAdmin!
Для CustomUser возвращает None (пропускает проверку).
Для PlatformAdmin проверяем только is_superuser (без groups/permissions).
"""
from platform_admin.models import PlatformAdmin
# Проверяем только PlatformAdmin, CustomUser пропускаем
if not isinstance(user_obj, PlatformAdmin):
return None
# Только суперпользователь имеет права
# (не используем groups/permissions из Django, т.к. AUTH_USER_MODEL != реальная модель)
return user_obj.is_active and user_obj.is_superuser
def has_module_perms(self, user_obj, app_label):
"""
Проверка module permissions для PlatformAdmin.
ВАЖНО: Этот backend работает ТОЛЬКО с PlatformAdmin!
Для CustomUser возвращает None (пропускает проверку).
Для PlatformAdmin проверяем только is_superuser (без groups/permissions).
"""
from platform_admin.models import PlatformAdmin
# Проверяем только PlatformAdmin, CustomUser пропускаем
if not isinstance(user_obj, PlatformAdmin):
return None
# Только суперпользователь имеет права
return user_obj.is_active and user_obj.is_superuser