""" 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