最完整实战:ant-design-vue-pro路由守卫如何守护前端安全?
【免费下载链接】ant-design-vue-pro 项目地址: https://gitcode.com/gh_mirrors/antd/ant-design-vue-pro
你是否还在为前端权限控制漏洞烦恼?作为前端安全的最后一道防线,路由守卫在ant-design-vue-pro中实现了从登录验证到动态权限的全流程管控。本文将通过3个核心步骤,带你掌握如何用路由守卫构建坚不可摧的前端安全壁垒,文末附赠完整代码示例与调试指南。
路由守卫的三重防御体系
ant-design-vue-pro的路由安全控制通过三级防护实现:登录状态验证、权限动态加载、页面访问拦截。这种架构确保未授权用户既无法绕过登录,也不能访问超出权限的页面。
核心实现文件分布在三个关键位置:
- 登录状态验证:src/permission.js
- 权限定义常量:src/core/permission/permission.js
- 路由配置表:src/config/router.config.js
第一步:登录状态验证(token拦截)
系统在用户登录成功后会生成令牌(Token)并存储在本地,路由守卫通过检查这个令牌判断用户是否有权访问页面。当用户访问需要授权的页面时,router.beforeEach钩子会自动触发验证流程。
// src/permission.js 核心验证逻辑
router.beforeEach((to, from, next) => {
NProgress.start() // 启动进度条
const token = storage.get(ACCESS_TOKEN) // 从本地存储获取令牌
if (token) {
if (to.path === loginRoutePath) {
// 已登录用户访问登录页时自动跳转至工作台
next({ path: defaultRoutePath })
NProgress.done()
} else {
// 验证用户权限信息是否已加载
if (store.getters.roles.length === 0) {
// 未加载则请求用户信息
store.dispatch('GetInfo').then(res => {
// 生成动态路由表
store.dispatch('GenerateRoutes', { token, ...res }).then(() => {
resetRouter() // 重置路由防止重复添加
store.getters.addRouters.forEach(r => router.addRoute(r))
next({ ...to, replace: true }) // 跳转到目标路由
})
})
} else {
next() // 权限已加载直接放行
}
}
} else {
// 无令牌时仅允许访问白名单页面
if (allowList.includes(to.name)) {
next()
} else {
// 重定向到登录页并记录原请求地址
next({ path: loginRoutePath, query: { redirect: to.fullPath } })
NProgress.done()
}
}
})
这段代码实现了三个关键功能:
- 未登录用户自动跳转至登录页
- 已登录用户访问登录页自动跳转至工作台
- 首次登录时动态加载用户权限与路由表
第二步:权限动态加载(菜单生成)
系统采用"权限-路由-菜单"联动机制,当用户登录后,后端会返回该用户的权限列表,前端根据权限动态生成可访问的路由与菜单。这种设计使不同角色用户看到完全不同的系统界面。
路由配置文件中通过permission字段定义页面所需权限:
// src/config/router.config.js 权限路由定义
{
path: '/dashboard',
name: 'dashboard',
component: RouteView,
meta: {
title: 'menu.dashboard',
icon: bxAnaalyse,
permission: ['dashboard'] // 所需权限标识
},
children: [
{
path: '/dashboard/analysis',
name: 'Analysis',
component: () => import('@/views/dashboard/Analysis'),
meta: {
title: 'menu.dashboard.analysis',
permission: ['dashboard'] // 子页面继承或扩展权限
}
}
]
}
权限常量定义了系统支持的操作类型,这些常量会被用于路由验证与页面按钮权限控制:
// src/core/permission/permission.js 权限常量定义
export const PERMISSION_ENUM = {
'add': { key: 'add', label: '新增' },
'delete': { key: 'delete', label: '删除' },
'edit': { key: 'edit', label: '修改' },
'query': { key: 'query', label: '查询' },
'get': { key: 'get', label: '详情' },
'enable': { key: 'enable', label: '启用' },
'disable': { key: 'disable', label: '禁用' },
'import': { key: 'import', label: '导入' },
'export': { key: 'export', label: '导出' }
}
第三步:页面权限控制(细粒度拦截)
除了路由级别的控制,系统还实现了页面元素级别的权限控制。通过自定义的$auth指令,可以在模板中轻松控制按钮等元素的显示与否,实现真正的细粒度权限管理。
// src/core/permission/permission.js 权限判断指令
function plugin (Vue) {
!Vue.prototype.$auth && Object.defineProperties(Vue.prototype, {
$auth: {
get () {
const _this = this
return (permissions) => {
const [permission, action] = permissions.split('.')
const permissionList = _this.$store.getters.roles.permissions
// 查找是否拥有指定权限
return permissionList.find((val) => val.permissionId === permission)
.actionList.findIndex((val) => val === action) > -1
}
}
}
})
}
在Vue组件中使用方式:
<!-- 在模板中控制按钮显示 -->
<a-button v-if="$auth('form.edit')" type="primary">编辑</a-button>
<a-button v-if="$auth('form.delete')" danger>删除</a-button>
常见问题与解决方案
1. 路由缓存导致权限不刷新
问题:用户切换角色后,已缓存的页面仍显示原权限菜单。
解决:在权限更新时调用resetRouter()重置路由,并使用replace方式跳转:
// src/router/index.js 路由重置方法
export function resetRouter () {
const newRouter = createRouter()
router.matcher = newRouter.matcher // 重置路由匹配器
}
2. 刷新页面后动态路由丢失
问题:F5刷新页面后,动态添加的路由消失导致404错误。
解决:在permission.js中确保页面刷新时重新生成路由:
// 当roles为空时重新请求用户信息生成路由
if (store.getters.roles.length === 0) {
store.dispatch('GetInfo').then(res => {
store.dispatch('GenerateRoutes', { token, ...res }).then(() => {
resetRouter()
store.getters.addRouters.forEach(r => router.addRoute(r))
next({ ...to, replace: true })
})
})
}
3. 权限控制失效调试技巧
- 检查本地存储的
ACCESS_TOKEN是否有效 - 通过Vue DevTools查看
store.getters.roles是否正确加载 - 验证
store.getters.addRouters是否包含预期路由 - 检查目标路由的
meta.permission是否与用户权限匹配
生产环境安全加固
在实际部署时,还需额外进行以下安全加固:
- Token安全:设置合理的Token过期时间,实现自动续期机制
- 路由白名单最小化:仅将必要页面加入
allowList - 权限二次验证:关键操作在前端验证后,后端仍需再次验证
- 错误监控:集成Sentry等工具捕获权限相关错误
// 建议添加的安全增强代码
// 在src/core/permission/permission.js中
Vue.prototype.$auth = function(permissions) {
// 开发环境给出权限不足提示
if (process.env.NODE_ENV === 'development') {
const hasPermission = checkPermission(permissions)
if (!hasPermission) {
console.warn(`权限不足:${permissions}`)
}
return hasPermission
}
return checkPermission(permissions)
}
总结与最佳实践
ant-design-vue-pro的路由守卫实现了一套完整的前端权限解决方案,其核心价值在于:
- 多层次防护:从路由拦截到按钮控制的全链路权限管理
- 动态适应性:根据用户角色实时生成权限路由
- 开发友好性:提供简洁API与完善的错误处理
最佳实践建议:
- 权限设计遵循"最小权限原则",只授予用户必要权限
- 路由配置集中管理,使用常量定义权限标识
- 定期审计权限控制逻辑,特别注意临界页面的访问控制
- 结合后端实现RBAC(基于角色的访问控制)模型
通过本文介绍的路由守卫实现方案,你可以为自己的项目构建起坚实的前端安全防线。记住,前端权限控制不是可有可无的功能,而是保护用户数据安全的重要屏障。立即检查你的项目是否存在权限漏洞,用路由守卫为前端安全保驾护航!
点赞收藏本文,关注作者获取更多ant-design-vue-pro实战技巧,下期将分享"动态菜单的性能优化策略"。
【免费下载链接】ant-design-vue-pro 项目地址: https://gitcode.com/gh_mirrors/antd/ant-design-vue-pro
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



