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"
>
-
-
+
+