lavkach3

Форк
0
52 строки · 1.5 Кб
1
from abc import ABC, abstractmethod
2
from typing import List, Type
3

4
from fastapi import Request
5
from fastapi.openapi.models import APIKey, APIKeyIn
6
from fastapi.security.base import SecurityBase
7

8
from core.exceptions import CustomException, UnauthorizedException
9

10

11
class BasePermission(ABC):
12
    exception = CustomException
13

14
    @abstractmethod
15
    async def has_permission(self, request: Request) -> bool:
16
        pass
17

18

19
class IsAuthenticated(BasePermission):
20
    exception = UnauthorizedException
21

22
    async def has_permission(self, request: Request) -> bool:
23
        return request.user.user_id is not None
24

25

26
class IsAdmin(BasePermission):
27
    exception = UnauthorizedException
28

29
    async def has_permission(self, request: Request) -> bool:
30
        user_id = request.user.user_id
31
        if not user_id:
32
            return False
33

34
        return await user_id.is_admin
35

36

37
class AllowAll(BasePermission):
38
    async def has_permission(self, request: Request) -> bool:
39
        return True
40

41

42
class PermissionDependency(SecurityBase):
43
    def __init__(self, permissions: List[Type[BasePermission]]):
44
        self.permissions = permissions
45
        self.model: APIKey = APIKey(**{"in": APIKeyIn.header}, name="Authorization")
46
        self.scheme_name = self.__class__.__name__
47

48
    async def __call__(self, request: Request):
49
        for permission in self.permissions:
50
            cls = permission()
51
            if not await cls.has_permission(request=request):
52
                raise cls.exception
53

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.