Рефакторинг: убрана зависимость от 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

@@ -1,4 +1,4 @@
"""
"""
Кастомный backend аутентификации для связывания ролей с Django permissions API.
ВАЖНО: Этот backend НЕ использует таблицы Django permissions из public schema!
@@ -7,8 +7,11 @@
ВАЖНО: Backend проверяет текущую схему перед обращением к tenant-only таблицам.
В public схеме ролевые проверки пропускаются (fallback на стандартные Django permissions).
ВАЖНО: Этот backend НЕ наследуется от ModelBackend!
Он реализует только has_perm/has_module_perms для проверки прав на основе ролей.
Аутентификацию (authenticate/get_user) выполняют другие backends.
"""
from django.contrib.auth.backends import ModelBackend
from django.db import connection
from django_tenants.utils import get_public_schema_name
from user_roles.services import RoleService
@@ -32,11 +35,12 @@ def _is_tenant_user(user_obj):
return isinstance(user_obj, CustomUser)
class RoleBasedPermissionBackend(ModelBackend):
class RoleBasedPermissionBackend:
"""
Backend, который предоставляет права на основе роли пользователя в текущем тенанте.
Расширяет стандартный ModelBackend, добавляя проверку прав на основе ролей из tenant schema.
НЕ наследуется от ModelBackend! Реализует только проверку прав (has_perm/has_module_perms).
Аутентификацию (authenticate/get_user) выполняют TenantUserBackend и PlatformAdminBackend.
Как это работает:
1. Django вызывает user.has_perm('products.add_product')
@@ -132,13 +136,10 @@ class RoleBasedPermissionBackend(ModelBackend):
return action in app_perms
else:
# Для PlatformAdmin проверяем стандартные permissions через ModelBackend
# Суперпользователь имеет все права
if user_obj.is_superuser:
return True
# Проверяем через родительский ModelBackend
return super().has_perm(user_obj, perm, obj)
# Для PlatformAdmin - этот backend НЕ обрабатывает PlatformAdmin
# Возвращаем None, чтобы Django перешёл к другому backend
# (PlatformAdminBackend должен обработать это)
return None
def has_module_perms(self, user_obj, app_label):
"""
@@ -179,10 +180,6 @@ class RoleBasedPermissionBackend(ModelBackend):
role_perms = self.ROLE_PERMISSIONS.get(user_role.code, {})
return app_label in role_perms and len(role_perms[app_label]) > 0
else:
# Для PlatformAdmin проверяем стандартные permissions через ModelBackend
# Суперпользователь имеет все права
if user_obj.is_superuser:
return True
# Проверяем через родительский ModelBackend
return super().has_module_perms(user_obj, app_label)
# Для PlatformAdmin - этот backend НЕ обрабатывает PlatformAdmin
# Возвращаем None, чтобы Django перешёл к другому backend
return None