MaxKB/apps/common/auth/authenticate.py
2023-09-15 17:40:35 +08:00

52 lines
1.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# coding=utf-8
"""
@project: qabot
@Author
@file authenticate.py
@date2023/9/4 11:16
@desc: 认证类
"""
from common.constants.permission_constants import Auth, get_permission_list_by_role, RoleConstants
from common.exception.app_exception import AppAuthenticationFailed
from django.core import cache
from django.core import signing
from rest_framework.authentication import TokenAuthentication
from smartdoc.settings import JWT_AUTH
from users.models.user import User
token_cache = cache.caches['token_cache']
class AnonymousAuthentication(TokenAuthentication):
def authenticate(self, request):
return None, None
class TokenAuth(TokenAuthentication):
# 重新 authenticate 方法,自定义认证规则
def authenticate(self, request):
auth = request.META.get('HTTP_AUTHORIZATION', None
)
# 未认证
if auth is None:
raise AppAuthenticationFailed(1003, '未登录,请先登录')
try:
# 解析 token
user = signing.loads(auth)
if 'id' in user:
cache_token = token_cache.get(auth)
if cache_token is None:
raise AppAuthenticationFailed(1002, "登录过期")
user = User.objects.get(id=user['id'])
# 续期
token_cache.touch(auth, timeout=JWT_AUTH['JWT_EXPIRATION_DELTA'].total_seconds())
rule = RoleConstants[user.role]
return user, Auth(role_list=[rule],
permission_list=get_permission_list_by_role(RoleConstants[user.role]))
else:
raise AppAuthenticationFailed(1002, "身份验证信息不正确!非法用户")
except Exception as e:
raise AppAuthenticationFailed(1002, "身份验证信息不正确!非法用户")