UnisKB/apps/users/serializers/login.py

55 lines
2.0 KiB
Python
Raw Normal View History

2025-04-14 12:11:23 +00:00
# coding=utf-8
"""
@project: MaxKB
@Author虎虎
@file login.py
@date2025/4/14 11:08
@desc:
"""
2025-04-16 12:09:00 +00:00
import datetime
2025-04-14 12:11:23 +00:00
from django.core import signing
from django.core.cache import cache
from django.db.models import QuerySet
from django.utils.translation import gettext_lazy as _
from rest_framework import serializers
from common.constants.authentication_type import AuthenticationType
from common.constants.cache_version import Cache_Version
from common.exception.app_exception import AppApiException
from common.utils.common import password_encrypt
from users.models import User
class LoginRequest(serializers.Serializer):
username = serializers.CharField(required=True, max_length=64, help_text=_("Username"), label=_("Username"))
password = serializers.CharField(required=True, max_length=128, label=_("Password"))
class LoginResponse(serializers.Serializer):
"""
登录响应对象
"""
token = serializers.CharField(required=True, label=_("token"))
class LoginSerializer(serializers.Serializer):
@staticmethod
def login(instance):
LoginRequest(data=instance).is_valid(raise_exception=True)
username = instance.get('username')
password = instance.get('password')
user = QuerySet(User).filter(username=username, password=password_encrypt(password)).first()
if user is None:
raise AppApiException(500, _('The username or password is incorrect'))
if not user.is_active:
raise AppApiException(1005, _("The user has been disabled, please contact the administrator!"))
token = signing.dumps({'username': user.username,
'id': str(user.id),
'email': user.email,
2025-04-16 12:09:00 +00:00
'type': AuthenticationType.SYSTEM_USER.value})
2025-04-15 12:37:38 +00:00
version, get_key = Cache_Version.TOKEN.value
2025-04-16 12:09:00 +00:00
cache.set(get_key(token), user, timeout=datetime.timedelta(seconds=60 * 60 * 2).seconds, version=version)
2025-04-14 12:11:23 +00:00
return {'token': token}