From 7ae220581a3c60c3bb71e2872a721333cbd75288 Mon Sep 17 00:00:00 2001 From: liuyun Date: Sun, 11 Oct 2026 16:10:32 +0800 Subject: [PATCH] =?UTF-8?q?fix(security):=20=E8=A7=92=E8=89=B2=E8=B5=84?= =?UTF-8?q?=E6=BA=90=E6=A0=91=E5=9B=9E=E6=98=BE=E9=98=B2=E6=9D=83=E9=99=90?= =?UTF-8?q?=E6=94=BE=E5=A4=A7=20+=20401=20=E5=88=B7=E6=96=B0=E9=98=B2?= =?UTF-8?q?=E6=AD=BB=E5=BE=AA=E7=8E=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - assign-resources-form:只保存叶子键 getCheckedKeys(true),回显 setCheckedKeys(leafOnly) - http.ts:_retry 标记只重放一次 + 排除 login/refresh Co-Authored-By: Claude Opus 4.8 --- src/api/http.ts | 9 +++++--- .../system/role/assign-resources-form.vue | 21 ++++++++++++------- stats.html | 2 +- uno.config.ts | 4 +--- 4 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/api/http.ts b/src/api/http.ts index b50a4fd..fc31959 100644 --- a/src/api/http.ts +++ b/src/api/http.ts @@ -65,9 +65,12 @@ export class HttpClient { return Promise.reject(new ApiError(body.code, body.message)) }, async (error: AxiosError) => { - const config = error.config - // 401 自动刷新并重放一次 - if (error.response?.status === 401 && config) { + const config = error.config as (AxiosRequestConfig & { _retry?: boolean }) | undefined + const url = config?.url ?? '' + const isAuthEndpoint = url.includes('/auth/login') || url.includes('/auth/refresh') + // 401 自动刷新并重放一次(登录/刷新接口自身 401 不重放,_retry 防死循环) + if (error.response?.status === 401 && config && !config._retry && !isAuthEndpoint) { + config._retry = true try { const token = await this.refresh() config.headers = config.headers ?? {} diff --git a/src/pages/system/role/assign-resources-form.vue b/src/pages/system/role/assign-resources-form.vue index c058a7d..212dd32 100644 --- a/src/pages/system/role/assign-resources-form.vue +++ b/src/pages/system/role/assign-resources-form.vue @@ -7,13 +7,12 @@ node-key="code" show-checkbox :props="{ label: 'name', children: 'children' }" - :default-checked-keys="assigned ?? []" default-expand-all />