27 lines
855 B
Python
27 lines
855 B
Python
from dataclasses import dataclass, field
|
|
from typing import Callable
|
|
|
|
@dataclass
|
|
class User:
|
|
username: str
|
|
is_authenticated: bool = False
|
|
roles: list[str] = field(default_factory=lambda: ["user"])
|
|
|
|
|
|
def required_roles(roles: list[str]):
|
|
def wrapper(fonction: Callable):
|
|
def internal_wrapper(user: User):
|
|
if not any(role in user.roles for role in roles): # True => [False, False, True]
|
|
raise PermissionError(f"L'utilisateur {user.username} n'a pas le rôle requis.")
|
|
return fonction(user)
|
|
return internal_wrapper
|
|
return wrapper
|
|
|
|
@required_roles(["admin", "modo"])
|
|
def operation_sensible(user: User):
|
|
return f"Opération sensible faite par {user.username}"
|
|
|
|
alice = User("alice@courriel.fr", True, ["modo"])
|
|
bob = User("bob@courriel.fr", True)
|
|
|
|
print(operation_sensible(alice)) |