fix: 切换账户后路由权限校验 — 防止通过旧标签/URL访问无权限页面

根因: router.beforeEach 在角色加载后 return true,不检查目标路由
是否在当前用户已注册的路由列表中。导致切换账户后,通过旧标签
或直接输入 URL 可访问前一个用户的页面。

修复: 在 return true 前增加 router.resolve() 检查,若目标路由
未注册(matched.length === 0)则拦截并提示无权访问。

数据库验证: 护士角色(role_id=201)确实没有住院医生工作站
(menu_id=288)的 sys_role_menu 权限,后端 getRouters 返回
正确。问题纯粹在前端路由守卫。
This commit is contained in:
2026-06-09 16:53:48 +08:00
parent 68cfa48820
commit babf62083a

View File

@@ -71,6 +71,14 @@ router.beforeEach(async (to, from) => {
return { path: '/login' }
}
}
// 铁律: 路由权限校验 — 目标路由必须在已注册的路由中存在
// 防止切换账户后,通过旧标签或直接输入 URL 访问无权限页面
const resolved = router.resolve(to)
if (resolved.matched.length === 0 || resolved.name === 'NotFound') {
// 路由不存在(未注册),拒绝导航
ElMessage.warning('无权访问该页面')
return { path: '/' }
}
return true
} else {
if (isWhiteList(to.path)) {