2.6 KiB
2.6 KiB
Admin 模块统一权限守卫策略
本文档遵循 @docs/AGENT_PROJECT_SPEC.md 规范,旨在说明 Admin 模块前端页面的权限守卫实现策略、覆盖范围及待办事项。
1. 统一守卫策略
根据决策,Admin 模块采用统一布局守卫策略。
- 守卫落点:
@/layouts/admin/AdminLayout.uvue - 触发时机:
onMounted生命周期钩子
所有使用 <AdminLayout> 组件包裹的页面,都会自动继承此安全策略,无需在各自页面内部重复编写守卫逻辑。
2. 守卫行为
守卫逻辑严格分为两步,符合前端“快速失败”和依赖方向原则:
-
登录检查(无 IO):
- 调用
services/analytics/authGuard.uts中的ensureAnalyticsLogin()。 - 行为:如果用户未登录(无有效 session),则中断页面加载,并自动跳转到登录页(
/pages/user/login),同时附带redirect参数,以便登录后能返回原页面。
- 调用
-
角色检查(依赖本地 Profile):
- 调用
utils/store.uts中的await getCurrentUser()获取当前用户的profile,该profile中包含了从ak_users同步的role字段。 - 行为:检查
role是否为'admin'或'analytics'之一。如果不是,则:uni.showToast({ title: '权限不足' })- 800ms 后
uni.switchTab({ url: '/pages/mall/consumer/index' })(按决策 B 跳转到消费者首页)。
- 调用
只有当登录和角色检查都通过后,AdminLayout 才会继续执行其内部的导航和组件渲染逻辑。
3. 覆盖范围
已确认被统一守卫覆盖的页面:
pages/mall/admin/index_new.uvue(通过其使用的AdminLayout)pages/mall/admin/product/product-statistics/index.uvuepages/mall/admin/user/Statistic.uvuepages/mall/admin/order/order-statistics/index.uvue(本次已改造)- 其他所有在模板中使用了
<AdminLayout>的页面。
例外与风险:未被统一守卫覆盖的 Admin 页面
以下在 pages.json 中注册的 admin 路由,由于是独立的“裸”页面,不会被 AdminLayout 的统一守卫保护,存在安全风险:
pages/mall/admin/indexpages/mall/admin/user-detailpages/mall/admin/merchant-detailpages/mall/admin/system-monitor
4. 待办事项
为实现 Admin 模块权限的全覆盖,建议后续处理上述例外页面:
- 方案 1(推荐):将这些独立的页面改造为使用
<AdminLayout>包裹,使其自动纳入统一守卫范围。 - 方案 2(临时):在这些页面的
onLoad钩子中,手动加入与AdminLayout中相同的守卫逻辑代码。