This commit is contained in:
80
auth/rbac_interface.py
Normal file
80
auth/rbac_interface.py
Normal file
@@ -0,0 +1,80 @@
|
||||
"""
|
||||
Интерфейс для RBAC операций, исключающий циркулярные импорты.
|
||||
|
||||
Этот модуль содержит только типы и абстрактные интерфейсы,
|
||||
не импортирует ORM модели и не создает циклических зависимостей.
|
||||
"""
|
||||
|
||||
from abc import ABC, abstractmethod
|
||||
from typing import Any, Protocol
|
||||
|
||||
|
||||
class RBACOperations(Protocol):
|
||||
"""
|
||||
Протокол для RBAC операций, позволяющий ORM моделям
|
||||
выполнять операции с правами без прямого импорта services.rbac
|
||||
"""
|
||||
|
||||
async def get_permissions_for_role(self, role: str, community_id: int) -> list[str]:
|
||||
"""Получает разрешения для роли в сообществе"""
|
||||
...
|
||||
|
||||
async def initialize_community_permissions(self, community_id: int) -> None:
|
||||
"""Инициализирует права для нового сообщества"""
|
||||
...
|
||||
|
||||
async def user_has_permission(
|
||||
self, author_id: int, permission: str, community_id: int, session: Any = None
|
||||
) -> bool:
|
||||
"""Проверяет разрешение пользователя в сообществе"""
|
||||
...
|
||||
|
||||
async def _roles_have_permission(
|
||||
self, role_slugs: list[str], permission: str, community_id: int
|
||||
) -> bool:
|
||||
"""Проверяет, есть ли у набора ролей конкретное разрешение в сообществе"""
|
||||
...
|
||||
|
||||
|
||||
class CommunityAuthorQueries(Protocol):
|
||||
"""
|
||||
Протокол для запросов CommunityAuthor, позволяющий RBAC
|
||||
выполнять запросы без прямого импорта ORM моделей
|
||||
"""
|
||||
|
||||
def get_user_roles_in_community(
|
||||
self, author_id: int, community_id: int, session: Any = None
|
||||
) -> list[str]:
|
||||
"""Получает роли пользователя в сообществе"""
|
||||
...
|
||||
|
||||
|
||||
# Глобальные переменные для dependency injection
|
||||
_rbac_operations: RBACOperations | None = None
|
||||
_community_queries: CommunityAuthorQueries | None = None
|
||||
|
||||
|
||||
def set_rbac_operations(ops: RBACOperations) -> None:
|
||||
"""Устанавливает реализацию RBAC операций"""
|
||||
global _rbac_operations
|
||||
_rbac_operations = ops
|
||||
|
||||
|
||||
def set_community_queries(queries: CommunityAuthorQueries) -> None:
|
||||
"""Устанавливает реализацию запросов сообщества"""
|
||||
global _community_queries
|
||||
_community_queries = queries
|
||||
|
||||
|
||||
def get_rbac_operations() -> RBACOperations:
|
||||
"""Получает реализацию RBAC операций"""
|
||||
if _rbac_operations is None:
|
||||
raise RuntimeError("RBAC operations не инициализированы. Вызовите set_rbac_operations()")
|
||||
return _rbac_operations
|
||||
|
||||
|
||||
def get_community_queries() -> CommunityAuthorQueries:
|
||||
"""Получает реализацию запросов сообщества"""
|
||||
if _community_queries is None:
|
||||
raise RuntimeError("Community queries не инициализированы. Вызовите set_community_queries()")
|
||||
return _community_queries
|
||||
Reference in New Issue
Block a user