Vue 实现不同用户权限的方法

在项目中,实现不同用户的权限控制是常见的需求也是常见的功能模块,例如管理系统中不同角色(管理员、普通用户等)应有不同的访问权限,小程序、App等在不同角色登入的时候显示的首页以及跳转访问不同的页面。本文将以 vue 为主要的代码框架介绍几种常见的权限控制方式。

1. 基于路由守卫的权限控制

1.1 方案概述

基于 Vue Router 的 beforeEach 进行全局路由守卫控制。我们可以在 vuexpinia 中存储用户角色,并在路由的 meta 字段中定义允许访问的角色。

1.2 实现步骤

  1. router 配置中为每个路由添加 meta 字段,存储允许访问的角色。
  2. 在 Vuex/Pinia 中存储用户角色。
  3. 使用 router.beforeEach 进行权限校验。

1.3 代码示例

// router/index.js
import { createRouter, createWebHistory } from 'vue-router';
import store from '@/store'; // 引入多个组件页面
import Home from '@/views/Home.vue';
import Admin from '@/views/Admin.vue';
import AddSomeFun from '@/views/AddSomeFun.vue';
import Login from '@/views/Login.vue'; // 定义路由,并且在 meta 中定义可访问的角色
const routes = [
{ path: '/', component: Home },
{ path: '/admin', component: Admin, meta: { roles: ['admin'] } },
{ path: '/addSomeFun', component: AddSomeFun, meta: { roles: ['user'] } },
{ path: '/login', component: Login }
]; // 创建路由
const router = createRouter({
history: createWebHistory(),
routes
}); // 路由校验
router.beforeEach((to, from, next) => {
const userRole = store.state.userRole; // 假设 Vuex 中存储了用户 user、管理员 admin 角色
if (to.meta.roles && !to.meta.roles.includes(userRole)) {
next('/'); // 无权限跳转到首页
} else {
next();
}
}); export default router;

2. 基于 Vue 指令的权限控制

2.1 方案概述

使用 Vue 指令 v-permission 来控制按钮、组件或模块的显示隐藏。

2.2 实现步骤

  1. 在 Vue 全局创建一个自定义指令 v-permission
  2. 在 main.js 引入注册。
  3. 该指令根据用户权限判断是否显示该元素。

2.3 代码示例

// directives/permission.js
// 指令封装
import { useStore } from 'vuex'; export default {
install(app) {
app.directive('permission', {
mounted(el, binding) {
const store = useStore();
const userRole = store.state.userRole;
if (!binding.value.includes(userRole)) {
el.parentNode?.removeChild(el);
}
}
});
}
};
// main.js
import { createApp } from 'vue';
import App from './App.vue';
import store from './store';
import permissionDirective from './directives/permission'; const app = createApp(App);
app.use(store);
app.use(permissionDirective); // 注册自定义指令
app.mount('#app');
<!-- 使用示例 -->
<button v-permission="['admin']">仅管理员可见</button>

3. 基于 Vuex(或 Pinia)的权限控制

3.1 方案概述

在 Vuex/Pinia 中存储权限信息,并在组件中通过 computed 计算属性动态控制组件或按钮的显示。

3.2 代码示例

// store/index.js
import { createStore } from 'vuex'; export default createStore({
state: {
userRole: 'user' // 假设存储用户角色
},
mutations: {
setUserRole(state, role) {
state.userRole = role;
}
}
});
<!-- 在组件中使用 Vuex 进行权限判断 -->
<template>
<button v-if="userRole === 'admin'">仅管理员可见</button>
</template> <script>
import { computed } from 'vue';
import { useStore } from 'vuex'; export default {
setup() {
const store = useStore();
const userRole = computed(() => store.state.userRole);
return { userRole };
}
};
</script>

4. 后端返回权限控制

4.1 方案概述

后端返回权限控制的方式有两种:

  1. 返回用户权限信息:前端获取角色信息后,使用前述方法进行权限控制。
  2. 后端返回可访问路由:后端返回用户可以访问的路由列表,前端使用 router.addRoute 动态注册。

4.2 代码示例(后端返回路由)

// 登录后获取用户权限,并动态添加路由
import router from '@/router';
import store from '@/store';
import axios from 'axios'; async function fetchUserRoutes() {
const res = await axios.post('/common/getUserRoutes'); // 假设后端返回路由信息
const routes = res.data routes.forEach(route => {
router.addRoute(route);
});
} fetchUserRoutes();

5. 总结

方法 适用场景 优势 缺点
路由守卫 页面级权限控制 适用于完整页面权限 无法控制按钮等细节
Vue 指令 组件、按钮级权限 适用于 UI 级别权限 需要手动移除元素
Vuex/Pinia 组件级权限 适用于灵活权限判断 需要在多个组件中维护权限逻辑
后端返回权限 适用于大规模权限管理 后端统一管理,灵活 需要动态更新前端路由

以上几种方式可以结合使用,根据实际业务需求选择合适的权限控制方式。

vue实现不同用户权限的方法的更多相关文章

  1. Oracle 用户权限管理方法

    Oracle 用户权限管理方法 sys;//系统管理员,拥有最高权限 system;//本地管理员,次高权限 scott;//普通用户,密码默认为tiger,默认未解锁 sys;//系统管理员,拥有最 ...

  2. Oracle SQL 基本操作之 用户权限管理方法

     Oracle SQL 基本操作之 用户权限管理方法 最近把有关用户操作和权限管理的东西整理了一下,虽然不少博客都有过类似的整理,但是自己发现他们的内容或多或少都有些错误.于是,本人亲自对每条语句进行 ...

  3. 解决将/etc/passwd文件中1000改为0后只能guest进入系统的问题 ||ubuntu下将普通用户权限升级为root用户权限的方法;

    其实我现在才知道linux系统对于用户权限管理比较严,在ubuntu下系统不允许root权限的用户进入图像界面系统.由于之前没弄过权限这个东西瞬间掉坑了了. 我是想修改一下root下的nginx.co ...

  4. Linux培训教程 linux下修改用户权限的方法

    一般我们日常碰到要修改用户权限的,往往是要么修改一下用户的gorupid,通过上面命令可以改;要么是把普通用户改成具有超级权限的用户,这个一般自己不能直接改,只能是root或有root权限的用户才能帮 ...

  5. 【转】 Oracle 用户权限管理方法

    sys;//系统管理员,拥有最高权限 system;//本地管理员,次高权限 scott;//普通用户,密码默认为tiger,默认未解锁 sys;//系统管理员,拥有最高权限 system;//本地管 ...

  6. MySQL学习——管理用户权限

    MySQL学习——管理用户权限 摘要:本文主要学习了使用DCL语句管理用户权限的方法. 了解用户权限 什么是用户 用户,指的就是操作和使用MySQL数据库的人.使用MySQL数据库需要用户先通过用户名 ...

  7. Spring Cloud实战: 基于Spring Cloud Gateway + vue-element-admin 实现的RBAC权限管理系统,实现网关对RESTful接口方法权限和自定义Vue指令对按钮权限的细粒度控制

    一. 前言 信我的哈,明天过年. 这应该是农历年前的关于开源项目 的最后一篇文章了. 有来商城 是基于 Spring Cloud OAuth2 + Spring Cloud Gateway + JWT ...

  8. MySQL查看用户权限的两种方法

    http://yanue.net/post-96.html MySQL查看用户权限命令的两方法: 一. 使用MySQL grants MySQL grant详细用法见:http://yanue.net ...

  9. linux普通用户权限设置为超级用户权限方法、sudo不用登陆密码

    以用户zato为例 普通用户权限设置为超级用户权限 进入有超级用户权限的账号 添加文件可写(w)权限 sudo chmod u+x /etc/sudoers 编辑/etc/sudoers文件 添加语句 ...

  10. mysql创建本地用户及赋予数据库权限的方法示例

    大家在安装 mysql 时通常会生成一个超级用户 root,很多人之后就一直沿用这一个用户,虽然这会很方便,但超级用户权限太大,在所有地方使用它通常是一个安全隐患. 这一点跟操作系统的用户管理也是类似 ...

随机推荐

  1. 即时通讯技术文集(第33期):IM开发综合技术合集(Part6) [共12篇]

    为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第33 期. [- 1 -] IM开发技术学习:揭秘微信朋友圈这种信息推流背后的系统设计 [链接 ...

  2. 阿里技术分享:闲鱼IM基于Flutter的移动端跨端改造实践

    本文由阿里闲鱼技术团队祈晴分享,本次有修订和改动,感谢作者的技术分享. 1.内容概述 本文总结了阿里闲鱼技术团队使用Flutter在对闲鱼IM进行移动端跨端改造过程中的技术实践等,文中对比了传统Nat ...

  3. 使用 httputils + sbe (Simple Binary Encoding) 实现金融级 java rpc

    1.认识 Simple Binary Encoding (sbe) 高性能Java库 Agrona 的主要目标是减少性能瓶颈,通过提供线程安全的直接和原子缓冲区.无装箱操作的原始类型列表.开散列映射和 ...

  4. python SQLAlchemy ORM——从零开始学习 01 安装库

    01基础库 1-1安装 依赖库:sqlalchemy pip install sqlalchemy #直接安装即可 1-2导入使用 这里讲解思路[个人的理解],具体写其实就是这个框架: 导入必要的接口 ...

  5. Canvas简历编辑器-选中绘制与拖拽多选交互方案

    Canvas简历编辑器-选中绘制与拖拽多选交互方案 在之前我们聊了聊如何基于Canvas与基本事件组合实现了轻量级DOM,并且在此基础上实现了如何进行管理事件以及多层级渲染的能力设计.那么此时我们就依 ...

  6. 直播预览层(AVCaptureVideoPreviewLayer)底层实现

    分析sampleBuffer(帧数据) 通过设置AVCaptureVideoDataOutput的代理,就能获取捕获到一帧一帧数据 [videoOutput setSampleBufferDelega ...

  7. 【YashanDB知识库】导入数据时报错:YAS-00008 type convert error:literal does not match format string

    本文内容来自YashanDB官网,原文内容请见 https://www.yashandb.com/newsinfo/7901522.html?templateId=1718516 现象 将数据通过SQ ...

  8. 安装K8s集群

    因阿里云加速服务调整,镜像加速服务自2024年7月起不再支持,拉取镜像,下载网络插件等操作,需要国际联网访问DockerHub. 安装全过程均使用ROOT权限. 1.安装前准备工作 这里采用3台Cen ...

  9. obsidian双向链接 不可链接到其他文章的段落|片段 解决方案

    前言 今天发现obsidian只能链接到其他文章的标题,不能链接到片段 一个简单的语法体现事物的普遍联系!|Obsidian知识管理 #2 双向链接|高级玩家_锌一(Strik0r)_哔哩哔哩_bil ...

  10. EMWIN图形库入门

    一.EMWIN图形库移植 在STM32ZET6(64KB SRAM.512KB FLASH)上移植,参考正点原子STM32F1 EMWIN开发手册_V2.0 STemWin源码可以在ST官网下载 版本 ...