Vue3 页面权限控制实战示例(路由守卫 + 权限判断)

这里做一套开箱即用、最简单、最实用 的 Vue3 权限控制方案,只针对个别页面做权限校验,满足条件才能访问,不满足直接跳转到登录/无权限页。

核心思路

  1. 在**路由元信息(meta)**里标记需要权限的页面
  2. 使用全局路由守卫监听页面跳转
  3. 判断用户权限 + 页面是否需要权限 → 决定是否放行

完整实现步骤

1. 路由配置(关键:给页面加权限标记)

router/index.js

javascript 复制代码
import { createRouter, createWebHistory } from 'vue-router'

const routes = [
  {
    path: '/',
    component: () => import('@/views/Home.vue'),
    meta: { requiresAuth: false } // 不需要权限
  },
  {
    path: '/login',
    component: () => import('@/views/Login.vue'),
    meta: { requiresAuth: false }
  },
  {
    path: '/admin',
    component: () => import('@/views/Admin.vue'),
    // ✅ 这个页面需要权限!
    meta: { requiresAuth: true, role: 'admin' } 
  },
  {
    path: '/user-center',
    component: () => import('@/views/UserCenter.vue'),
    // ✅ 这个页面也需要权限!
    meta: { requiresAuth: true } 
  },
  {
    path: '/403',
    component: () => import('@/views/403.vue')
  }
]

const router = createRouter({
  history: createWebHistory(),
  routes
})

export default router

2. 全局路由守卫(权限判断核心)

router/index.js 继续追加:

javascript 复制代码
// 模拟:从登录接口/状态管理拿到用户信息
const getCurrentUser = () => {
  return {
    isLogin: true, // 用户是否登录
    role: 'admin'  // 用户角色:admin / user / guest
  }
}

// 全局路由守卫
router.beforeEach((to, from, next) => {
  const user = getCurrentUser()
  // 判断目标页面是否需要权限
  const needAuth = to.meta.requiresAuth

  // 1. 不需要权限 → 直接放行
  if (!needAuth) {
    return next()
  }

  // 2. 需要权限,但用户未登录 → 跳登录
  if (!user.isLogin) {
    return next('/login')
  }

  // 3. 需要指定角色(比如只有管理员能进)
  if (to.meta.role && user.role !== to.meta.role) {
    return next('/403') // 无权限页
  }

  // 4. 权限满足 → 放行
  next()
})

3. 状态管理版(真实项目用法)

如果你用 Pinia 存储用户权限,把 getCurrentUser 换成:

javascript 复制代码
import { useUserStore } from '@/stores/user'

router.beforeEach((to, from, next) => {
  const userStore = useUserStore() // Pinia 用户仓库

  if (to.meta.requiresAuth && !userStore.isLogin) {
    next('/login')
  } 
  else if (to.meta.role && userStore.role !== to.meta.role) {
    next('/403')
  } 
  else {
    next()
  }
})

3 种常用权限场景(直接复制用)

场景1:只要登录就能访问

javascript 复制代码
{
  path: '/user-center',
  component: () => import('@/views/UserCenter.vue'),
  meta: { requiresAuth: true }
}

场景2:必须是管理员才能访问(个别页面)

javascript 复制代码
{
  path: '/admin',
  component: () => import('@/views/Admin.vue'),
  meta: { requiresAuth: true, role: 'admin' }
}

场景3:必须拥有某个权限码才能访问

javascript 复制代码
{
  path: '/order-manage',
  component: () => import('@/views/OrderManage.vue'),
  meta: { requiresAuth: true, permission: 'order:view' }
}

守卫里判断:

javascript 复制代码
if (to.meta.permission && !user.permissions.includes(to.meta.permission)) {
  next('/403')
}

403 无权限页面示例

views/403.vue

vue 复制代码
<template>
  <div class="flex-center">
    <h1>⚠️ 无权限访问</h1>
    <p>你没有权限查看该页面</p>
    <button @click="$router.push('/')">返回首页</button>
  </div>
</template>

<script setup>
</script>

总结

  1. 给需要权限的页面 配置 meta: { requiresAuth: true }
  2. 全局路由守卫统一校验权限
  3. 支持:登录校验、角色校验、权限码校验
  4. 只控制个别页面,不影响其他页面,非常轻量

这套方案是企业最常用的轻量权限方案,你直接复制到项目里就能跑起来。

相关推荐
晓晓hh6 小时前
JavaSE学习——迭代器
java·开发语言·学习
Laurence6 小时前
C++ 引入第三方库(一):直接引入源文件
开发语言·c++·第三方库·添加·添加库·添加包·源文件
kyriewen117 小时前
你点的“刷新”是假刷新?前端路由的瞒天过海术
开发语言·前端·javascript·ecmascript·html5
014-code7 小时前
String.intern() 到底干了什么
java·开发语言·面试
421!7 小时前
GPIO工作原理以及核心
开发语言·单片机·嵌入式硬件·学习
摇滚侠7 小时前
JAVA 项目教程《苍穹外卖-12》,微信小程序项目,前后端分离,从开发到部署
java·开发语言·vue.js·node.js
@insist1238 小时前
网络工程师-生成树协议(STP/RSTP/MSTP)核心原理与应用
服务器·开发语言·网络工程师·软考·软件水平考试
Timer@8 小时前
LangChain 教程 04|Agent 详解:让 AI 学会“自己干活“
javascript·人工智能·langchain
野生技术架构师8 小时前
2026年牛客网最新Java面试题总结
java·开发语言
环黄金线HHJX.8 小时前
Tuan符号系统重塑智能开发
开发语言·人工智能·算法·编辑器