diff --git a/backend/apps/system/api/login.py b/backend/apps/system/api/login.py index 8e360e08..70d85146 100644 --- a/backend/apps/system/api/login.py +++ b/backend/apps/system/api/login.py @@ -3,6 +3,7 @@ from fastapi import APIRouter, Depends, HTTPException from fastapi.security import OAuth2PasswordRequestForm from apps.system.schemas.system_schema import BaseUserDTO from common.core.deps import SessionDep, Trans +from common.utils.crypto import sqlbot_decrypt from ..crud.user import authenticate from common.core.security import create_access_token from datetime import timedelta @@ -11,12 +12,14 @@ from common.core.schemas import Token router = APIRouter(tags=["login"], prefix="/login") @router.post("/access-token") -def local_login( +async def local_login( session: SessionDep, trans: Trans, form_data: Annotated[OAuth2PasswordRequestForm, Depends()] ) -> Token: - user: BaseUserDTO = authenticate(session=session, account=form_data.username, password=form_data.password) + origin_account = await sqlbot_decrypt(form_data.username) + origin_pwd = await sqlbot_decrypt(form_data.password) + user: BaseUserDTO = authenticate(session=session, account=origin_account, password=origin_pwd) if not user: raise HTTPException(status_code=400, detail=trans('i18n_login.account_pwd_error')) if not user.oid or user.oid == 0: diff --git a/backend/common/utils/crypto.py b/backend/common/utils/crypto.py new file mode 100644 index 00000000..ce5d7b95 --- /dev/null +++ b/backend/common/utils/crypto.py @@ -0,0 +1,4 @@ +from sqlbot_xpack.core import sqlbot_decrypt as xpack_sqlbot_decrypt + +async def sqlbot_decrypt(text: str) -> str: + return await xpack_sqlbot_decrypt(text) \ No newline at end of file diff --git a/backend/main.py b/backend/main.py index c4571893..9024658c 100644 --- a/backend/main.py +++ b/backend/main.py @@ -29,6 +29,7 @@ async def lifespan(app: FastAPI): init_sqlbot_cache() init_dynamic_cors(app) SQLBotLogUtil.info("✅ SQLBot 初始化完成") + await sqlbot_xpack.core.clean_xpack_cache() yield SQLBotLogUtil.info("SQLBot 应用关闭") diff --git a/backend/pyproject.toml b/backend/pyproject.toml index 3e4a7c71..ea6d490a 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -36,7 +36,7 @@ dependencies = [ "pyyaml (>=6.0.2,<7.0.0)", "fastapi-mcp (>=0.3.4,<0.4.0)", "tabulate>=0.9.0", - "sqlbot-xpack==0.0.3.8", + "sqlbot-xpack==0.0.3.9", "fastapi-cache2>=0.2.2", "sqlparse>=0.5.3", "redis>=6.2.0", diff --git a/frontend/auto-imports.d.ts b/frontend/auto-imports.d.ts index 56d36587..f66cb83b 100644 --- a/frontend/auto-imports.d.ts +++ b/frontend/auto-imports.d.ts @@ -8,4 +8,5 @@ export {} declare global { const ElMessage: typeof import('element-plus-secondary/es')['ElMessage'] const ElMessageBox: typeof import('element-plus-secondary/es')['ElMessageBox'] + const LicenseGenerator: any } diff --git a/frontend/src/api/login.ts b/frontend/src/api/login.ts index 6fc486b9..efe894e2 100644 --- a/frontend/src/api/login.ts +++ b/frontend/src/api/login.ts @@ -1,15 +1,19 @@ import { request } from '@/utils/request' - export const AuthApi = { - login: (credentials: { username: string; password: string }) => - request.post<{ + login: (credentials: { username: string; password: string }) => { + const entryCredentials = { + username: LicenseGenerator.sqlbotEncrypt(credentials.username), + password: LicenseGenerator.sqlbotEncrypt(credentials.password), + } + return request.post<{ data: any token: string - }>('/login/access-token', credentials, { + }>('/login/access-token', entryCredentials, { headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, - }), + }) + }, logout: () => request.post('/auth/logout'), info: () => request.get('/user/info'), } diff --git a/frontend/src/router/watch.ts b/frontend/src/router/watch.ts index d91cf605..a5fc9c41 100644 --- a/frontend/src/router/watch.ts +++ b/frontend/src/router/watch.ts @@ -50,12 +50,10 @@ const loadXpackStatic = () => { if (document.getElementById('sqlbot_xpack_static')) { return Promise.resolve() } - const url = '/xpack_static/license-generator.umd.js' + const url = `/xpack_static/license-generator.umd.js?t=${Date.now()}` return new Promise((resolve, reject) => { request .loadRemoteScript(url, 'sqlbot_xpack_static', () => { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore LicenseGenerator?.init(import.meta.env.VITE_API_BASE_URL).then(() => { resolve(true) }) diff --git a/frontend/src/utils/request.ts b/frontend/src/utils/request.ts index 6e22a9da..5cbdc90d 100644 --- a/frontend/src/utils/request.ts +++ b/frontend/src/utils/request.ts @@ -99,8 +99,7 @@ class HttpService { // Skip auth for xpack_static requests return config } - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore + const request_key = LicenseGenerator.generate() config.headers['X-SQLBOT-KEY'] = request_key @@ -266,8 +265,6 @@ class HttpService { heads['X-SQLBOT-ASSISTANT-ONLINE'] = assistantStore.getOnline } } - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore const request_key = LicenseGenerator.generate() heads['X-SQLBOT-KEY'] = request_key diff --git a/frontend/src/views/system/user/User.vue b/frontend/src/views/system/user/User.vue index 466d4eb5..9c140a70 100644 --- a/frontend/src/views/system/user/User.vue +++ b/frontend/src/views/system/user/User.vue @@ -51,8 +51,13 @@ @selection-change="handleSelectionChange" > - - + +