Рефакторинг: убрана зависимость от 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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user