fix: repair login about redirect query (#3592)

* fix: repair login about redirect query

* fix: about buildRoutesAction and redirect

* fix: make sure unknown redirect will back to home
This commit is contained in:
xachary
2024-02-11 14:30:44 +08:00
committed by GitHub
parent e6a73840ab
commit 236ddf3471
6 changed files with 64 additions and 34 deletions

View File

@@ -46,10 +46,13 @@ export function usePermission() {
const tabStore = useMultipleTabStore(); const tabStore = useMultipleTabStore();
tabStore.clearCacheTabs(); tabStore.clearCacheTabs();
resetRouter(); resetRouter();
// 动态加载路由(再次)
const routes = await permissionStore.buildRoutesAction(); const routes = await permissionStore.buildRoutesAction();
routes.forEach((route) => { routes.forEach((route) => {
router.addRoute(route as unknown as RouteRecordRaw); router.addRoute(route as unknown as RouteRecordRaw);
}); });
permissionStore.setLastBuildMenuTime(); permissionStore.setLastBuildMenuTime();
closeAll(); closeAll();
} }

View File

@@ -38,7 +38,7 @@ export function createPermissionGuard(router: Router) {
try { try {
await userStore.afterLoginAction(); await userStore.afterLoginAction();
if (!isSessionTimeout) { if (!isSessionTimeout) {
next((to.query?.redirect as string) || '/'); next(decodeURIComponent((to.query?.redirect as string) || '/'));
return; return;
} }
} catch { } catch {
@@ -71,16 +71,6 @@ export function createPermissionGuard(router: Router) {
return; return;
} }
// Jump to the 404 page after processing the login
if (
from.path === LOGIN_PATH &&
to.name === PAGE_NOT_FOUND_ROUTE.name &&
to.fullPath !== (userStore.getUserInfo.homePath || PageEnum.BASE_HOME)
) {
next(userStore.getUserInfo.homePath || PageEnum.BASE_HOME);
return;
}
// get userinfo while last fetch time is empty // get userinfo while last fetch time is empty
if (userStore.getLastUpdateTime === 0) { if (userStore.getLastUpdateTime === 0) {
try { try {
@@ -91,29 +81,48 @@ export function createPermissionGuard(router: Router) {
} }
} }
if (permissionStore.getIsDynamicAddedRoute) { // 动态路由加载(首次)
next(); if (!permissionStore.getIsDynamicAddedRoute) {
const routes = await permissionStore.buildRoutesAction();
[...routes, PAGE_NOT_FOUND_ROUTE].forEach((route) => {
router.addRoute(route as unknown as RouteRecordRaw);
});
// 记录动态路由加载完成
permissionStore.setDynamicAddedRoute(true);
// 现在的to动态路由加载之前的可能为PAGE_NOT_FOUND_ROUTE例如登陆后刷新的时候
// 此处应当重定向到fullPath否则会加载404页面内容
next({ path: to.fullPath, replace: true, query: to.query });
return; return;
} }
const routes = await permissionStore.buildRoutesAction();
routes.forEach((route) => {
router.addRoute(route as unknown as RouteRecordRaw);
});
router.addRoute(PAGE_NOT_FOUND_ROUTE as unknown as RouteRecordRaw);
permissionStore.setDynamicAddedRoute(true);
if (to.name === PAGE_NOT_FOUND_ROUTE.name) { if (to.name === PAGE_NOT_FOUND_ROUTE.name) {
// 动态添加路由后此处应当重定向到fullPath否则会加载404页面内容 // 遇到不存在页面后续逻辑不再处理redirect阻止下面else逻辑
next({ path: to.fullPath, replace: true, query: to.query }); from.query.redirect = '';
if (
from.path === LOGIN_PATH &&
to.fullPath !== (userStore.getUserInfo.homePath || PageEnum.BASE_HOME)
) {
// 登陆重定向不存在路由,转去“首页”
next({ path: userStore.getUserInfo.homePath || PageEnum.BASE_HOME, replace: true });
} else {
// 正常前往“404”页面
next();
}
} else if (from.query.redirect) {
// 存在redirect
const redirect = decodeURIComponent((from.query.redirect as string) || '');
if (redirect === to.fullPath) {
// 已经被redirect
next();
} else {
// 指向redirect
next({ path: redirect, replace: true });
}
} else { } else {
const redirectPath = (from.query.redirect || to.path) as string; // 正常访问
const redirect = decodeURIComponent(redirectPath); next();
const nextData = to.path === redirect ? { ...to, replace: true } : { path: redirect };
next(nextData);
} }
}); });
} }

View File

@@ -110,14 +110,17 @@ export const useUserStore = defineStore({
this.setSessionTimeout(false); this.setSessionTimeout(false);
} else { } else {
const permissionStore = usePermissionStore(); const permissionStore = usePermissionStore();
// 动态路由加载(首次)
if (!permissionStore.isDynamicAddedRoute) { if (!permissionStore.isDynamicAddedRoute) {
const routes = await permissionStore.buildRoutesAction(); const routes = await permissionStore.buildRoutesAction();
routes.forEach((route) => { [...routes, PAGE_NOT_FOUND_ROUTE].forEach((route) => {
router.addRoute(route as unknown as RouteRecordRaw); router.addRoute(route as unknown as RouteRecordRaw);
}); });
router.addRoute(PAGE_NOT_FOUND_ROUTE as unknown as RouteRecordRaw); // 记录动态路由加载完成
permissionStore.setDynamicAddedRoute(true); permissionStore.setDynamicAddedRoute(true);
} }
goHome && (await router.replace(userInfo?.homePath || PageEnum.BASE_HOME)); goHome && (await router.replace(userInfo?.homePath || PageEnum.BASE_HOME));
} }
return userInfo; return userInfo;
@@ -150,7 +153,18 @@ export const useUserStore = defineStore({
this.setToken(undefined); this.setToken(undefined);
this.setSessionTimeout(false); this.setSessionTimeout(false);
this.setUserInfo(null); this.setUserInfo(null);
goLogin && router.push(PageEnum.BASE_LOGIN); if (goLogin) {
// 直接回登陆页
router.replace(PageEnum.BASE_LOGIN);
} else {
// 回登陆页带上当前路由地址
router.replace({
path: PageEnum.BASE_LOGIN,
query: {
redirect: encodeURIComponent(router.currentRoute.value.fullPath),
},
});
}
}, },
/** /**
@@ -164,6 +178,7 @@ export const useUserStore = defineStore({
title: () => h('span', t('sys.app.logoutTip')), title: () => h('span', t('sys.app.logoutTip')),
content: () => h('span', t('sys.app.logoutMessage')), content: () => h('span', t('sys.app.logoutMessage')),
onOk: async () => { onOk: async () => {
// 主动登出不带redirect地址
await this.logout(true); await this.logout(true);
}, },
}); });

View File

@@ -33,7 +33,8 @@ export function checkStatus(
if (stp === SessionTimeoutProcessingEnum.PAGE_COVERAGE) { if (stp === SessionTimeoutProcessingEnum.PAGE_COVERAGE) {
userStore.setSessionTimeout(true); userStore.setSessionTimeout(true);
} else { } else {
userStore.logout(true); // 被动登出带redirect地址
userStore.logout(false);
} }
break; break;
case 403: case 403:

View File

@@ -77,7 +77,8 @@ const transform: AxiosTransform = {
case ResultEnum.TIMEOUT: case ResultEnum.TIMEOUT:
timeoutMsg = t('sys.api.timeoutMessage'); timeoutMsg = t('sys.api.timeoutMessage');
const userStore = useUserStoreWithOut(); const userStore = useUserStoreWithOut();
userStore.logout(true); // 被动登出带redirect地址
userStore.logout(false);
break; break;
default: default:
if (message) { if (message) {

View File

@@ -124,6 +124,7 @@
} }
function goLogin() { function goLogin() {
// 主动登出不带redirect地址
userStore.logout(true); userStore.logout(true);
lockStore.resetLockInfo(); lockStore.resetLockInfo();
} }