From babf62083adf6a3a86800381c5d1b8cf4b5c8b29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=8E=E4=BD=97?= Date: Tue, 9 Jun 2026 16:53:48 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=88=87=E6=8D=A2=E8=B4=A6=E6=88=B7?= =?UTF-8?q?=E5=90=8E=E8=B7=AF=E7=94=B1=E6=9D=83=E9=99=90=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=20=E2=80=94=20=E9=98=B2=E6=AD=A2=E9=80=9A=E8=BF=87=E6=97=A7?= =?UTF-8?q?=E6=A0=87=E7=AD=BE/URL=E8=AE=BF=E9=97=AE=E6=97=A0=E6=9D=83?= =?UTF-8?q?=E9=99=90=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因: router.beforeEach 在角色加载后 return true,不检查目标路由 是否在当前用户已注册的路由列表中。导致切换账户后,通过旧标签 或直接输入 URL 可访问前一个用户的页面。 修复: 在 return true 前增加 router.resolve() 检查,若目标路由 未注册(matched.length === 0)则拦截并提示无权访问。 数据库验证: 护士角色(role_id=201)确实没有住院医生工作站 (menu_id=288)的 sys_role_menu 权限,后端 getRouters 返回 正确。问题纯粹在前端路由守卫。 --- healthlink-his-ui/src/permission.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/healthlink-his-ui/src/permission.js b/healthlink-his-ui/src/permission.js index 4fe6240a5..386a9f26d 100755 --- a/healthlink-his-ui/src/permission.js +++ b/healthlink-his-ui/src/permission.js @@ -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)) {