Подготовка к замене AuthRejectReason
This commit is contained in:
@@ -8,3 +8,4 @@
|
||||
Пакет служебных классов и функций
|
||||
"""
|
||||
|
||||
from .date_utils import DateUtils
|
||||
|
||||
9
net/xeaf/rack/utils/auth/__init__.py
Normal file
9
net/xeaf/rack/utils/auth/__init__.py
Normal file
@@ -0,0 +1,9 @@
|
||||
# DRF Rack
|
||||
# Библиотека классов расширений для Django REST Framework
|
||||
#
|
||||
# Автор: Николай В. Анохин <n.anokhin@xeaf.net>
|
||||
# Все права защищены. Лицензия: MIT
|
||||
|
||||
"""
|
||||
Классов авторизации
|
||||
"""
|
||||
61
net/xeaf/rack/utils/auth/expiring_token_authentication.py
Normal file
61
net/xeaf/rack/utils/auth/expiring_token_authentication.py
Normal file
@@ -0,0 +1,61 @@
|
||||
# DRF Rack
|
||||
# Библиотека классов расширений для Django REST Framework
|
||||
#
|
||||
# Автор: Николай В. Анохин <n.anokhin@xeaf.net>
|
||||
# Все права защищены. Лицензия: MIT
|
||||
|
||||
"""
|
||||
Описание класса ExpiringTokenAuthentication
|
||||
"""
|
||||
|
||||
from typing import Any
|
||||
|
||||
from rest_framework.authentication import TokenAuthentication
|
||||
from rest_framework.request import Request
|
||||
|
||||
from net.xeaf.rack.managers import LocaleManager
|
||||
from net.xeaf.rack.managers import SessionManager
|
||||
from net.xeaf.rack.models import AccountModel
|
||||
from net.xeaf.rack.models import SessionModel
|
||||
|
||||
|
||||
class ExpiringTokenAuthentication(TokenAuthentication):
|
||||
"""
|
||||
Реализует механизм авторизации для Токенов со сроком действия
|
||||
"""
|
||||
|
||||
AUTH_TOKEN_PARAM = "x-auth-token"
|
||||
""" Идентификатор параметра токена """
|
||||
|
||||
def authenticate(self, request: Request) -> tuple[AccountModel | None, CoreSessionModel | None] | tuple[Any, Any] | None:
|
||||
"""
|
||||
Метод авторизации
|
||||
|
||||
:param request: Информация о запросе
|
||||
"""
|
||||
|
||||
LocaleManager.adjust_request_language(request)
|
||||
|
||||
key = request.query_params.get(self.AUTH_TOKEN_PARAM, None)
|
||||
if key is not None:
|
||||
return self.authenticate_credentials(key)
|
||||
|
||||
return super().authenticate(request)
|
||||
|
||||
def authenticate_credentials(self, key: str) -> tuple[AccountModel | None, CoreSessionModel | None]:
|
||||
"""
|
||||
Проверка Токена авторизации
|
||||
|
||||
:param key: Токен авторизации
|
||||
"""
|
||||
|
||||
session = SessionManager[SessionModel].find_by_token(token=key)
|
||||
if not session or session.is_expired():
|
||||
return None, None
|
||||
|
||||
account = session.account
|
||||
if not account.is_active or account.is_deleted():
|
||||
return None, None
|
||||
|
||||
SessionManager.renew_session(session)
|
||||
return session.account, session
|
||||
46
net/xeaf/rack/utils/date_utils.py
Normal file
46
net/xeaf/rack/utils/date_utils.py
Normal file
@@ -0,0 +1,46 @@
|
||||
# DRF Rack
|
||||
# Библиотека классов расширений для Django REST Framework
|
||||
#
|
||||
# Автор: Николай В. Анохин <n.anokhin@xeaf.net>
|
||||
# Все права защищены. Лицензия: MIT
|
||||
|
||||
"""
|
||||
Описание класса DateUtils
|
||||
"""
|
||||
|
||||
import datetime
|
||||
|
||||
from django.utils import timezone
|
||||
|
||||
|
||||
class DateUtils:
|
||||
"""
|
||||
Реализует функции работы с датами и временем
|
||||
"""
|
||||
|
||||
@classmethod
|
||||
def now(cls) -> datetime.datetime:
|
||||
"""
|
||||
Возвращает текущую дату и время
|
||||
"""
|
||||
|
||||
return timezone.now()
|
||||
|
||||
@classmethod
|
||||
def shift_time(cls, date_time: datetime.datetime | None = None, days: int = 0, hours: int = 0, minutes: int = 0, seconds: int = 0) -> datetime.datetime:
|
||||
"""
|
||||
Добавляет к дате и времени заданное количество дней, часов, минут и секунд
|
||||
|
||||
:param date_time: Дата и время
|
||||
:param days: Количество дней
|
||||
:param hours: Количество часов
|
||||
:param minutes: Количество минут
|
||||
:param seconds: Количество секунд
|
||||
|
||||
:return: Дата и время с добавленным временем
|
||||
"""
|
||||
|
||||
if date_time is None:
|
||||
date_time = cls.now()
|
||||
|
||||
return date_time + datetime.timedelta(days=days, hours=hours, minutes=minutes, seconds=seconds)
|
||||
Reference in New Issue
Block a user