⚒️ 重大重构 LoveACE V2
引入了 mongodb 对数据库进行了一定程度的数据加密 性能改善 代码简化 统一错误模型和响应 使用 apifox 作为文档
This commit is contained in:
55
loveace/router/dependencies/auth.py
Normal file
55
loveace/router/dependencies/auth.py
Normal file
@@ -0,0 +1,55 @@
|
||||
from typing import Annotated
|
||||
|
||||
from fastapi import Depends, HTTPException
|
||||
from fastapi.security import HTTPAuthorizationCredentials, HTTPBearer
|
||||
from sqlalchemy import select
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
|
||||
from loveace.database.auth.token import AuthMEToken
|
||||
from loveace.database.auth.user import ACEUser
|
||||
from loveace.database.creator import get_db_session
|
||||
from loveace.router.dependencies.logger import LoggerMixin, no_user_logger_mixin
|
||||
from loveace.router.schemas.error import ProtectRouterErrorToCode
|
||||
from loveace.router.schemas.exception import UniResponseHTTPException
|
||||
|
||||
auth_scheme = HTTPBearer(auto_error=False)
|
||||
|
||||
|
||||
async def get_user_by_token(
|
||||
authorization: Annotated[
|
||||
HTTPAuthorizationCredentials | None, Depends(auth_scheme)
|
||||
] = None,
|
||||
db_session: AsyncSession = Depends(get_db_session),
|
||||
logger: LoggerMixin = Depends(no_user_logger_mixin),
|
||||
) -> ACEUser:
|
||||
"""通过Token获取用户"""
|
||||
if not authorization:
|
||||
logger.error("缺少认证令牌")
|
||||
raise ProtectRouterErrorToCode().invalid_authentication.to_http_exception(
|
||||
logger.trace_id
|
||||
)
|
||||
token = authorization.credentials
|
||||
try:
|
||||
async with db_session as session:
|
||||
query = select(AuthMEToken).where(AuthMEToken.token == token)
|
||||
result = await session.execute(query)
|
||||
user_token = result.scalars().first()
|
||||
if user_token is None:
|
||||
logger.error("无效的认证令牌")
|
||||
raise ProtectRouterErrorToCode().invalid_authentication.to_http_exception(
|
||||
logger.trace_id
|
||||
)
|
||||
query = select(ACEUser).where(ACEUser.userid == user_token.user_id)
|
||||
result = await session.execute(query)
|
||||
user = result.scalars().first()
|
||||
if user is None:
|
||||
logger.error("用户不存在")
|
||||
raise ProtectRouterErrorToCode().invalid_authentication.to_http_exception(
|
||||
logger.trace_id
|
||||
)
|
||||
return user
|
||||
except (HTTPException, UniResponseHTTPException):
|
||||
raise
|
||||
except Exception as e:
|
||||
logger.exception(e)
|
||||
raise ProtectRouterErrorToCode().server_error.to_http_exception(logger.trace_id)
|
||||
Reference in New Issue
Block a user