Skip to content

权限控制与路由守卫

**本文引用的文件** - [main.js](file://app/devicemate-app/main.js) - [login.js](file://app/devicemate-app/config/login.js) - [baseUrl.js](file://app/devicemate-app/config/baseUrl.js) - [request.js](file://app/devicemate-app/config/request.js) - [index.js(设备端Store模块索引)](file://app/devicemate-app/store/modules/index.js) - [login.js(设备端登录Store模块)](file://app/devicemate-app/store/modules/login.js) - [pages.json](file://app/devicemate-app/pages.json) - [App.vue](file://app/devicemate-app/App.vue) - [localstorage.js](file://app/devicemate-app/utils/localstorage.js) - [userMixins.js](file://app/devicemate-app/utils/userMixins.js) - [common.js](file://app/devicemate-app/utils/common.js) - [dictMixins.js](file://app/devicemate-app/utils/dictMixins.js) - [mescroll-uni.js](file://app/devicemate-app/components/mescroll-uni/mescroll-uni.js) - [mescroll-mixins.js](file://app/devicemate-app/components/mescroll-uni/mescroll-mixins.js) - [upgrade.js](file://app/devicemate-app/utils/upgrade/upgrade.js) - [upgrade-config.js](file://app/devicemate-app/utils/upgrade/upgrade-config.js) - [dialog.js](file://app/devicemate-app/utils/upgrade/dialog.js)

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考虑
  8. 故障排查指南
  9. 结论
  10. 附录

简介

本文件面向DeviceMate移动端应用(基于uni-app)的权限控制系统,聚焦于“路由守卫”的实现与最佳实践。当前仓库中未发现显式的全局前置路由守卫代码(如在路由库中注册的全局前置钩子),但已具备完善的登录态校验工具、用户信息存储与页面清单配置。本文将基于现有能力,系统化阐述如何通过登录态检查、页面级权限控制、路由跳转策略与缓存更新机制,构建可扩展的权限控制方案,并给出可落地的实施建议与常见问题处理。

项目结构

围绕权限控制与路由守卫的关键目录与文件如下:

  • 应用入口与全局初始化:main.js、App.vue
  • 登录态与鉴权工具:config/login.js、config/request.js、config/baseUrl.js、utils/localstorage.js
  • 页面清单与导航配置:pages.json
  • 状态管理模块:store/modules/index.js、store/modules/login.js
  • 常用工具与混入:utils/common.js、utils/userMixins.js、utils/dictMixins.js
  • 组件与UI:uview-ui、mescroll-uni等

图表来源

章节来源

核心组件

  • 登录态校验工具:提供登录态检查与登录成功后的重定向逻辑,用于页面级或组件级的权限拦截。
  • 请求封装与基础URL:统一HTTP请求与后端接口前缀,便于后续对接鉴权服务。
  • 本地存储:提供userInfo等关键用户信息的持久化读写,是权限缓存的基础。
  • Store登录模块:提供登录URL等状态的集中管理,便于在组件中读取与联动。
  • 页面清单:定义应用页面与TabBar,为“白名单/黑名单”路由策略提供依据。

章节来源

架构总览

DeviceMate当前采用“页面级权限控制”思路:在页面进入时调用登录态校验函数,若未登录则跳转至登录页;登录成功后根据返回结果进行页面重定向。该模式无需全局前置守卫即可实现基本的登录保护与路由跳转控制。

图表来源

详细组件分析

登录态校验与路由跳转

  • 登录态检查:从本地存储读取用户信息,若不存在则强制跳转至登录页。
  • 登录成功回调:登录成功后写入用户信息并重定向至首页。
  • 可扩展点:可在登录成功后拉取用户权限清单并写入本地存储,作为后续页面级权限判断的数据源。

图表来源

章节来源

页面清单与路由白名单/黑名单

  • 白名单:登录页、ADFS登录页、错误页等特殊路由应纳入白名单,允许未登录用户访问。
  • 黑名单:业务功能页(如设备管理、维修、巡检等)默认需登录,未登录时统一跳转至登录页。
  • TabBar路由:首页、设备、消息、我的等TabBar页面可视为“半白名单”,通常允许访问但内部可能有子权限。

图表来源

章节来源

权限缓存策略与更新机制

  • 缓存位置:userInfo、权限清单等关键信息建议存储于本地存储,避免每次进入页面都发起网络请求。
  • 更新时机:登录成功后、用户主动刷新、或后台推送权限变更事件时触发更新。
  • 失效处理:检测到token过期或服务端返回未授权时,清空本地用户信息并跳转登录页。

图表来源

章节来源

基于角色的访问控制(RBAC)与动态路由

  • 角色元信息:可在页面清单或路由配置中增加roles元信息字段,用于标识页面所需的角色集合。
  • 动态路由生成:登录成功后根据用户角色动态生成菜单与路由,注入到应用路由表中。
  • 注入时机:建议在应用初始化阶段完成,确保页面进入时能快速匹配权限。

图表来源

章节来源

页面级权限控制与组件混入

  • 在页面进入生命周期中调用登录态校验工具,必要时结合用户角色与页面roles元信息进行细粒度控制。
  • 使用混入(mixins)将权限检查逻辑抽象为可复用的片段,减少重复代码。

图表来源

章节来源

依赖关系分析

  • 应用入口依赖全局工具与状态管理,登录态校验工具依赖本地存储。
  • 页面清单决定哪些页面属于白名单/黑名单,直接影响路由跳转策略。
  • Store模块提供登录URL等状态,便于在组件中读取与联动。

图表来源

章节来源

性能考虑

  • 减少网络请求:将用户信息与权限清单缓存于本地存储,仅在登录成功或权限变更时更新。
  • 避免重复校验:在页面进入时仅做一次登录态检查,避免在多次生命周期中重复校验。
  • 路由注入优化:动态路由注入应在应用初始化阶段完成,避免在页面渲染过程中频繁修改路由表。

故障排查指南

  • 无法跳转登录页
    • 检查登录态校验函数是否被正确调用。
    • 确认本地存储中userInfo是否为空。
    • 排查重定向路径是否正确。
  • 登录成功后未跳转首页
    • 检查登录成功回调中的重定向逻辑。
    • 确认返回的用户信息是否完整。
  • 权限不生效
    • 检查页面roles元信息与用户角色是否匹配。
    • 确认权限清单是否已缓存且未过期。
  • 页面白名单/黑名单误判
    • 核对pages.json中的页面路径与跳转逻辑。
    • 确认TabBar与普通页面的区分是否合理。

章节来源

结论

DeviceMate当前以“页面级权限控制”为核心,通过登录态校验工具与本地存储实现了基础的路由守卫效果。建议在此基础上逐步引入“基于角色的访问控制(RBAC)”与“动态路由注入”,并在应用初始化阶段完成权限数据的拉取与缓存,从而形成一套可扩展、可维护的权限控制体系。同时,完善白名单/黑名单配置与错误处理机制,确保用户体验与安全性。

附录

  • 实施步骤建议
    • 在登录成功后拉取用户角色与权限清单,写入本地存储。
    • 在应用初始化阶段根据角色动态生成可访问路由并注入。
    • 在页面进入时调用登录态校验与角色校验,未通过则跳转登录页。
    • 定期轮询或监听权限变更事件,及时更新本地缓存。
  • 常见问题
    • 登录态丢失:清空本地用户信息并跳转登录页。
    • 权限不足:提示无权限并引导至可访问页面。
    • 路由注入失败:检查动态注入时机与路由表结构。