Spaces:
Sleeping
Sleeping
| """ | |
| Role-Based Access Control (RBAC) Utilities | |
| Provides role checking dependencies for FastAPI routes. | |
| """ | |
| import logging | |
| from typing import Callable | |
| from fastapi import Depends, HTTPException, status | |
| from core.auth import get_current_user | |
| from core.models import User, UserRole | |
| logger = logging.getLogger(__name__) | |
| def require_role(required_role: UserRole) -> Callable[[User], User]: | |
| """ | |
| Dependency that requires a specific user role. | |
| Args: | |
| required_role: The UserRole required to access the endpoint | |
| Returns: | |
| Dependency function that returns the user if authorized, raises 403 otherwise | |
| Raises: | |
| HTTPException: 403 Forbidden if user doesn't have required role | |
| """ | |
| async def role_checker(current_user: User = Depends(get_current_user)) -> User: | |
| if current_user.role != required_role: | |
| logger.warning( | |
| f"Access denied: user {current_user.id} has role {current_user.role}, " | |
| f"required {required_role}" | |
| ) | |
| raise HTTPException( | |
| status_code=status.HTTP_403_FORBIDDEN, | |
| detail=f"Insufficient permissions. Required role: {required_role}" | |
| ) | |
| return current_user | |
| return role_checker | |