core.container.authorization¶
src.core.container.authorization
¶
Authorization dependency factories.
Casbin RBAC enforcement for role and permission checks. Enforcer is initialized at application startup.
Reference
See docs/architecture/authorization-architecture.md for complete RBAC patterns and permission specifications.
Classes¶
Functions¶
init_enforcer
async
¶
Initialize Casbin AsyncEnforcer at application startup.
Creates enforcer with: - Model config from infrastructure/authorization/model.conf - PostgreSQL adapter for persistent policy storage
MUST be called during FastAPI lifespan startup. Enforcer is app-scoped singleton (stored in _enforcer module variable).
Returns:
| Type | Description |
|---|---|
AsyncEnforcer
|
Initialized AsyncEnforcer instance. |
Raises:
| Type | Description |
|---|---|
RuntimeError
|
If enforcer is already initialized. |
Reference
- docs/architecture/authorization-architecture.md
Source code in src/core/container/authorization.py
get_enforcer
¶
Get Casbin AsyncEnforcer singleton.
MUST be called after init_enforcer() during startup.
Returns:
| Type | Description |
|---|---|
AsyncEnforcer
|
The initialized enforcer. |
Raises:
| Type | Description |
|---|---|
RuntimeError
|
If called before init_enforcer(). |
Source code in src/core/container/authorization.py
get_authorization
async
¶
Get authorization adapter (request-scoped).
Creates CasbinAdapter with: - App-scoped enforcer (pre-initialized at startup) - Request-scoped audit (for per-request audit logging) - App-scoped cache, event_bus, logger
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
audit
|
AuditProtocol
|
Request-scoped audit adapter for logging authorization checks. |
Depends(get_audit)
|
Returns:
| Type | Description |
|---|---|
AuthorizationProtocol
|
CasbinAdapter implementing AuthorizationProtocol. |
Usage
Presentation Layer (FastAPI endpoint)¶
from fastapi import Depends from src.domain.protocols import AuthorizationProtocol
@router.get("/accounts") async def list_accounts( auth: AuthorizationProtocol = Depends(get_authorization), user: User = Depends(get_current_user), ): if not await auth.check_permission(user.id, "accounts", "read"): raise HTTPException(403, "Permission denied") ...
Reference
- docs/architecture/authorization-architecture.md