feat: bootstrap user rbac foundation

This commit is contained in:
wren
2026-04-29 15:23:19 +08:00
parent b45d61fa97
commit b3ad4a6f33
16 changed files with 4498 additions and 104 deletions
@@ -4,18 +4,22 @@
POST /auth/login — 统一登录(OAuth + 密码自动检测)
POST /auth/password_login — 账密登录
响应格式按新项目规范使用 Result。
前端当前统一按 ``success + message + data`` 解析登录结果,
这里显式对齐该契约,避免登录成功却被前端误判为失败。
"""
from fastapi import Request
from typing import Any
from fastapi import Depends, Request
from fastapi.responses import JSONResponse
from fastapi_common.fastapi_common_web.controller import BaseController
from fastapi_common.fastapi_common_web.domain.responses import Result
from fastapi_common.fastapi_common_web.exception.LeauditException import LeauditException
from fastapi_common.fastapi_common_logger import logger
from fastapi_common.fastapi_common_security.security import verify_access_token
from fastapi_modules.fastapi_leaudit.domian.Dto.auth.loginDto import PasswordLoginDTO, OAuthLoginDTO
from fastapi_modules.fastapi_leaudit.domian.vo.auth.loginTokenVo import LoginTokenVO
from fastapi_modules.fastapi_leaudit.domian.Dto.auth.loginDto import PasswordLoginDTO
from fastapi_modules.fastapi_leaudit.services import IAuthService
from fastapi_modules.fastapi_leaudit.services.impl.authServiceImpl import AuthServiceImpl
@@ -60,10 +64,13 @@ class AuthController(BaseController):
Password=requestData["password"],
)
else:
return JSONResponse(status_code=400, content={"code": 400, "message": "无效的登录请求格式", "data": None})
return JSONResponse(
status_code=400,
content={"success": False, "message": "无效的登录请求格式", "data": None},
)
return JSONResponse(status_code=200, content={
"code": 200,
"success": True,
"message": "ok",
"data": {
"access_token": vo.access_token,
@@ -74,10 +81,16 @@ class AuthController(BaseController):
},
})
except LeauditException as e:
logger.error(f"登录失败: {e.message}")
return JSONResponse(
status_code=e.statusCode,
content={"success": False, "message": e.message, "data": None},
)
except Exception as e:
logger.error(f"登录失败: {e}")
return JSONResponse(status_code=401, content={
"code": 401, "message": str(e), "data": None,
"success": False, "message": "登录失败,请稍后重试", "data": None,
})
@self.router.post("/password_login")
@@ -88,10 +101,22 @@ class AuthController(BaseController):
dto = PasswordLoginDTO(**requestData)
vo = await self.AuthService.PasswordLogin(Sub=dto.sub, Password=dto.password)
return JSONResponse(status_code=200, content={
"code": 200, "message": "ok", "data": vo.model_dump(),
"success": True, "message": "ok", "data": vo.model_dump(),
})
except LeauditException as e:
logger.error(f"密码登录失败: {e.message}")
return JSONResponse(
status_code=e.statusCode,
content={"success": False, "message": e.message, "data": None},
)
except Exception as e:
logger.error(f"密码登录失败: {e}")
return JSONResponse(status_code=401, content={
"code": 401, "message": str(e), "data": None,
"success": False, "message": "登录失败,请稍后重试", "data": None,
})
@self.router.get("/me", response_model=Result[dict[str, Any]])
async def GetCurrentUser(payload: dict[str, Any] = Depends(verify_access_token)):
"""获取当前登录用户信息。"""
Data = await self.AuthService.GetCurrentUser(UserId=int(payload["user_id"]))
return Result.success(data=Data)