36 lines
1.3 KiB
Python
36 lines
1.3 KiB
Python
|
|
from fastapi import Depends, HTTPException
|
||
|
|
from sqlalchemy.orm import Session
|
||
|
|
from starlette.requests import Request
|
||
|
|
|
||
|
|
from web.auth.session import get_current_user
|
||
|
|
from web.database import get_db
|
||
|
|
from web.models.rbac import Permission, UserRole, role_permissions
|
||
|
|
from web.models.user import User, UserRoleEnum
|
||
|
|
|
||
|
|
|
||
|
|
def require_role(*roles: str):
|
||
|
|
def dep(request: Request, db: Session = Depends(get_db)) -> User:
|
||
|
|
user = get_current_user(request, db)
|
||
|
|
if user.role.value not in roles:
|
||
|
|
raise HTTPException(status_code=403, detail="Недостаточно прав")
|
||
|
|
return user
|
||
|
|
return Depends(dep)
|
||
|
|
|
||
|
|
|
||
|
|
def require_permission(permission_name: str):
|
||
|
|
def dep(request: Request, db: Session = Depends(get_db)) -> User:
|
||
|
|
user = get_current_user(request, db)
|
||
|
|
if user.role == UserRoleEnum.system:
|
||
|
|
return user
|
||
|
|
has = (
|
||
|
|
db.query(Permission)
|
||
|
|
.join(role_permissions, Permission.id == role_permissions.c.permission_id)
|
||
|
|
.join(UserRole, UserRole.role_id == role_permissions.c.role_id)
|
||
|
|
.filter(UserRole.user_id == user.id, Permission.name == permission_name)
|
||
|
|
.first()
|
||
|
|
)
|
||
|
|
if not has:
|
||
|
|
raise HTTPException(status_code=403, detail="Недостаточно прав")
|
||
|
|
return user
|
||
|
|
return Depends(dep)
|