From c2e8526f8f857be5e3a8c6f2b39c5efd424de33e Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期四, 15 十月 2026 11:50:24 +0800
Subject: [PATCH] refactor(auth): 优化认证逻辑和界面组件结构
---
src/store/auth.ts | 48 ++++++++++++++++++++++++++++++++++++++----------
1 files changed, 38 insertions(+), 10 deletions(-)
diff --git a/src/store/auth.ts b/src/store/auth.ts
index 15fd19e..c2b1dd6 100644
--- a/src/store/auth.ts
+++ b/src/store/auth.ts
@@ -29,6 +29,8 @@
const router = useRouter();
const loginLoading = ref(false);
+ let sessionVersion = 0;
+ let logoutTask: Promise<void> | null = null;
/**
* 寮傛澶勭悊鐧诲綍鎿嶄綔
@@ -44,6 +46,7 @@
) {
// 寮傛澶勭悊鐢ㄦ埛鐧诲綍鎿嶄綔骞惰幏鍙� accessToken
let userInfo: null | UserInfo = null;
+ const version = ++sessionVersion;
try {
let loginResult: AuthApi.LoginResult;
loginLoading.value = true;
@@ -65,6 +68,7 @@
}
}
const { accessToken, refreshToken } = loginResult;
+ if (version !== sessionVersion) return { userInfo: null };
// 濡傛灉鎴愬姛鑾峰彇鍒� accessToken
if (accessToken) {
@@ -78,6 +82,7 @@
// // getAccessCodesApi(),
// ]);
const fetchUserInfoResult = await fetchUserInfo();
+ if (version !== sessionVersion) return { userInfo: null };
userInfo = fetchUserInfoResult.user;
@@ -98,8 +103,11 @@
});
}
}
+ } catch (error) {
+ if (version === sessionVersion) throw error;
+ return { userInfo: null };
} finally {
- loginLoading.value = false;
+ if (version === sessionVersion) loginLoading.value = false;
}
return {
@@ -107,16 +115,28 @@
};
}
- async function logout(redirect: boolean = true) {
+ function logout(redirect: boolean = true): Promise<void> {
+ if (logoutTask) return logoutTask;
+ const accessToken = accessStore.accessToken;
+ const tenant = { tenantId: accessStore.tenantId, visitTenantId: accessStore.visitTenantId };
+ const fullPath = router.currentRoute.value.fullPath;
+ ++sessionVersion;
+ // 鏈嶅姟鍣ㄦ敞閿�鐙珛鎵ц锛屾湰鍦版竻鐞嗕笌璺宠浆涓嶇瓑寰呯綉缁溿��
+ // 浣跨敤閫�鍑哄墠鐨� token 鍜岀鎴峰揩鐓э紝閬垮厤娓呯悊鍚庝涪澶辨敞閿�涓婁笅鏂囥��
+ if (accessToken) void logoutApi(accessToken, tenant).catch(() => {});
+ logoutTask = clearSessionAndNavigate(redirect, fullPath).finally(() => { logoutTask = null; });
+ return logoutTask;
+ }
+
+ async function clearSessionAndNavigate(redirect: boolean, fullPath: string) {
try {
- const accessToken = accessStore.accessToken as string;
- if (accessToken) {
- await logoutApi(accessToken);
- }
- } catch {
- // 涓嶅仛浠讳綍澶勭悊
+ resetAllStores();
+ } catch (error) {
+ console.error('Failed to reset business stores during logout', error);
}
- resetAllStores();
+ // 璁よ瘉娓呯悊涓嶈兘渚濊禆涓氬姟 store 鐨勯噸缃粨鏋溿��
+ accessStore.$reset();
+ userStore.$reset();
accessStore.setLoginExpired(false);
// 鍥炵櫥褰曢〉甯︿笂褰撳墠璺敱鍦板潃
@@ -124,18 +144,26 @@
path: LOGIN_PATH,
query: redirect
? {
- redirect: encodeURIComponent(router.currentRoute.value.fullPath),
+ redirect: encodeURIComponent(fullPath),
}
: {},
});
}
async function fetchUserInfo() {
+ const version = sessionVersion;
+ const accessToken = accessStore.accessToken;
// 鍔犺浇
// eslint-disable-next-line no-useless-assignment
let authPermissionInfo: AuthPermissionInfo | null = null;
authPermissionInfo = await getAuthPermissionInfoApi();
+ if (version !== sessionVersion || accessToken !== accessStore.accessToken) {
+ throw new Error('鐧诲綍鐘舵�佸凡鍙樺寲锛屽拷鐣ユ棫浼氳瘽鐨勭敤鎴蜂俊鎭�');
+ }
await loadAuditPolicy();
+ if (version !== sessionVersion || accessToken !== accessStore.accessToken) {
+ throw new Error('鐧诲綍鐘舵�佸凡鍙樺寲锛屽拷鐣ユ棫浼氳瘽鐨勭敤鎴蜂俊鎭�');
+ }
// userStore
userStore.setUserInfo(authPermissionInfo.user);
userStore.setUserRoles(authPermissionInfo.roles);
--
Gitblit v1.9.3