Source code for src.module.authorization.infrastructure.condition_engines
"""Pluggable ABAC condition engines.
The active engine is selected via MULTITENANT['ABAC_CONDITION_ENGINE'].
"""
from __future__ import annotations
from src.share_kernel.domain.interfaces import ConditionEngine
_engine_instance: ConditionEngine | None = None
[docs]
def get_condition_engine() -> ConditionEngine:
"""Return the configured condition engine singleton."""
global _engine_instance
if _engine_instance is not None:
return _engine_instance
from src.share_kernel.settings import get_setting
engine_type = str(get_setting("ABAC_CONDITION_ENGINE"))
if engine_type == "json":
from src.module.authorization.infrastructure.condition_engines.json_engine import (
JsonConditionEngine,
)
_engine_instance = JsonConditionEngine()
elif engine_type == "cedar":
from src.module.authorization.infrastructure.condition_engines.cedar_engine import (
CedarConditionEngine,
)
_engine_instance = CedarConditionEngine()
elif engine_type == "casbin":
from src.module.authorization.infrastructure.condition_engines.casbin_engine import (
CasbinConditionEngine,
)
_engine_instance = CasbinConditionEngine()
else:
from src.share_kernel.domain.exceptions import ConfigurationError
raise ConfigurationError(f"Unknown condition engine: {engine_type}")
return _engine_instance
def reset_engine() -> None:
"""Reset the cached engine instance. For testing only."""
global _engine_instance
_engine_instance = None