vue项目权限管理

1.权限分类

权限管理主要分为后端权限和前端权限。后端权限是关键,主要控制对数据库的操作;前端权限为辅,主要表现在对界面显示、路由导航、按钮显示操作与否、无效请求前端拦截和响应拦截提升用户体验等。

2.前端权限主要思路

    菜单的控制:在登录成功后,会得到后端提供的权限数据。前端根据权限数据,展示对应的菜单;
    界面的控制

        点击根据用户数据显示的对应菜单,显示不同界面
        如果用户没有登录,手动在地址栏敲入某个需要权限的界面的地址, 则需要跳转到登录界面
        如果用户已经登录,如果手动敲入非权限内的地址,则需要跳转404 界面
    按钮的控制:在某个菜单的界面中, 还得根据权限数据, 展示出可进行操作的按钮,比如删除, 修改, 增加
    请求和响应的控制(接口):如果用户通过非常规操作, 比如通过浏览器调试工具将某些禁用的按钮变成启用状态, 此时发的请求, 也应该被前端所拦截


3.Vue的权限控制实现

说明:使用mock模拟后端返回数据

path代表路由地址,authName代表菜单名,children代表子菜单,rights代表该菜单下该用户拥有的权限

mockjs配置:

https://blog.csdn.net/qq_34569497/article/details/132496048

import Mock from 'mockjs'const menuList = [{'id': 1, path:'/uploadSpec','authName': "上传spec", icon: 'User', children:[], rights:['view','add','edit','delete']},{'id': 2, path:'/showSpec', 'authName': "Spec预览", icon: 'DataAnalysis',children:[], rights:['view','add','edit','delete']},{'id': 3, path:'/generateTxt', 'authName': "生成测试数据", icon: 'DataAnalysis',children:[], rights:['view','add','edit','delete']},{'id': 4, path:'/generateCronjob', 'authName': "生成转码程序", icon: 'Promotion',children:[], rights:['view','add','edit','delete']},{'id': 5, path:'/pdfCompare', 'authName': "PDF文档对比", icon: 'DocumentCopy',children:[], rights:['view','add','edit','delete']},{'id': 6, path:'/resourceUpdate', 'authName': "资源更新管理", icon: 'Management',children:[], rights:['view','add','edit','delete']},{'id': 7, path:'/generateTestCase', 'authName': "自动生成ST/SIT案例", icon: 'Files',children:[], rights:['view','add','edit','delete']},{'id': 8, path:'/userManagement', 'authName': "用户管理", icon: 'User', rights:['view']},{'id': 9, path:'/roleManagement', 'authName': "角色管理", icon: 'Stamp', rights:['view']},
]Mock.mock("/user/login", Mock.mock({"code": 200,"success": true,"data": {"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwidXNlck5hbWUiOiJhZG1pbiIsIm5pY2tOYW1lIjoi6LaF566hIiwiaWNvbiI6IiIsInJvbGVJZCI6MSwic3ViIjoiYWRtaW4iLCJleHAiOjE2OTI3NzMzNTMsImp0aSI6ImZkNmVkOWZiMjdiYzQxODg5OWRmYmYzNzhlMTMzZmQ0In0.APGpN-i2edKwPQA52LP10aDEM2DZi7G71k8f_njGcpE"}
})
)Mock.mock("/user/me", Mock.mock({"code": 200,"success": true,"data": {"id": 1,"userName": "admin","nickName": "超管","icon": "","roleId": 1,"menuList": menuList}
})
)Mock.mock("/role/delete", Mock.mock({"code": 200,"success": true,
})
)

 

3.1菜单权限

后端(mock)提供菜单权限数据,根据数据渲染一级和二级菜单,并将数据存到vuex中;

权限数据rightList: setRightList(登录成功后将数据设置到vuex中)
            Home.vue中引入mapState,并在computed中映射到rightList,并将rightList设置到menuList中
            刷新数据后菜单栏消失,将vuex中数据存到localStorage或者sessionStorage中
            退出登录后删除sessionStorage和vuex中的数据(刷新vuex数据,跳转页面后,window.location.reload())

参考以下:

vue权限管理——菜单权限设置__Jyann_的博客-CSDN博客

3.2界面权限(路由权限):

判断用户是否登录:token
            什么时机判断登录:路由全局守卫,to.path进行判断 === "/login"直接next(); 否则需要获取token,如果token不存在,跳转到登录页,有则next()
            手动在地址栏敲入地址:没有权限也会显示该界面。
                需要权限控制的页面,使用动态路由进行管理
                登录成功后,根据登录后的rightList用户拥有的权限,动态添加路由规则
                对路由规则和权限字符串进行映射
            router.js中导出,initDynamicRoutes()方法,登录后导入该方法,并遍历rightList,并将路由添加到Home页面的children中

动态路由在刷新后,又不存在了,但是在登录后点刷新操作不会再次登录,所以需要将在App.vue中created()中导入并执行initDynamicRoutes

 详细见以下:

vue3动态路由设置__Jyann_的博客-CSDN博客

3.3 按钮权限:


            按钮也是根据数据显示,数据中有rights属性定义该用户拥有的所有权限。
            实现:使用自定义指令。
                permission.js中created()中方法实现
                initDynamicRoutes给用户对应的router中动态添加meta元数据后,permission.js中通过router.currentRoute就可以获取
                对比指令中指定的role和rightList中的role相同则像有权限,不同则删除
                可禁用元素或者删除

参考我以下文章:

vue权限管理——按钮控制__Jyann_的博客-CSDN博客

3.4(请求和响应控制)接口权限:


            登录后,每次发起请求前携带请求头token
            根据用户权限数据,判断为非权限请求,则拒绝响应:
                判断当前请求的行为
                    restful请求风格
                        get请求-》view
                        post请求-》add
                        put请求-》edit
                        delete请求-》delete请求
                const actionMapping = {
                    'get':'view',
                    'post':'add',
                    'put':'edit',
                    'delete':'delete',
                }
                action中数据和currentRoute中数据不匹配则拒绝请求,return new Promise(new Error("没有操作权限"))
            响应控制:请求返回401,token无效或者后期,则需要跳转到登录界面

详细参考我以下文章:

vue权限管理——请求和响应权限控制__Jyann_的博客-CSDN博客

4.小结 

前端权限控制必须根据后端返回数据实现

菜单控制:vuex和sessionStorage数据必须一致
    界面控制:
        路由导航守卫,防止跳过登录界面
        动态路由可以让不存在权限的界面的路由根本不存在
    按钮控制:
        路由规则中增加路由元数据meta
        通过路由对象可以得到当前路由规则,以及存储在此规则中的meta数据
        自定义指令可以方便的实现按钮控制
    请求和响应控制:
        请求和响应拦截器的使用
        请求方式行为的映射关系,需要请求api规范

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/52479.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot中Mapper.xml的入参方式

在SpringBoot开发过程中,我们使用 ***Mapper.xml***Mapper.java 来封装对数据库表的 CURD 操作,正常每张表会有一组对应的文件。 一、Mapper常见用法 下面例举一个查询操作: 数据表t_sap_customer,表中有字段id、code、name、c…

2023河南萌新联赛第(六)场:河南理工大学 C - 旅游

2023河南萌新联赛第(六)场:河南理工大学 C - 旅游 时间限制:C/C 1秒,其他语言2秒 空间限制:C/C 262144K,其他语言524288K Special Judge, 64bit IO Format: %lld 题目描述 小C喜欢旅游&#xf…

江西武功山旅游攻略(周末两日游)

一、 往返路线 1: 出发路线 周五晚上上海出发坐火车🚄到江西萍乡(11.5小时,卧铺550左右) 打车到江西武功山景区,120-150元左右,人均30元,1小时10分左右到达 或者 🚗到达萍乡北之后 出站后步行200米到长途汽车站,乘旅游巴士直达武功山游…

HCIP STP协议

STP协议 STP协议概念生成树为什么要用STP STP名词解释根网桥根端口指定端口非指定端口 STP的版本802.1DPVSTPVST 快速生成树 STP协议概念 IEEE 802.1d STP(生成树协议,Spanning-Tree Protocol)协议: ①使冗余端口置于“阻塞状态”…

设计模式(7)模板方法模式

一、定义: 定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。它是一种类行为型模式。 //模板方法抽象类 public abstract class AbstractClass {//模板方法publ…

keepalived双机热备,keepalived+lvs(DR)

本节主要学习了keepalivedlvs的作用和配置方法主要配置调度器和web节点,还有keepalived的双击热备,主要内容有概述,安装,功能模块,配置双击热备,验证方法,双击热备的脑裂现象和VIP无法通信。 目…

17.HPA和rancher

文章目录 HPA部署 metrics-server部署HPA Rancher部署Rancherrancher添加集群仪表盘创建 namespace仪表盘创建 Deployments仪表盘创建 service 总结 HPA HPA(Horizontal Pod Autoscaling)Pod 水平自动伸缩,Kubernetes 有一个 HPA 的资源&…

SQL事务

事务的概念: 事务是在数据库上按照一定的逻辑顺序执行的任务序列,既可以由用户手动执行,也可以由某种数据库程序自动执行。事务就是一些SQL语句组(每条单独的SQL语句也算一个事务),其中事务中的SQL…

04-Numpy基础-利用数组进行数据处理

NumPy数组使你可以将许多种数据处理任务表述为简洁的数组表达式(否则需要编 写循环)。用数组表达式代替循环的做法,通常被称为矢量化。一般来说,矢量化 数组运算要比等价的纯Python方式快上一两个数量级(甚至更多&…

WPF实战项目十二(API篇):配置AutoMapper

1、新建类库WPFProjectShared,在类库下新建文件夹Dtos,新建BaseDto.cs,继承INotifyPropertyChanged,实现通知更新。 public class BaseDto : INotifyPropertyChanged{public int Id { get; set; }public event PropertyChangedEv…

Ant Design Vue 日期选择器DatePicker传给后台日期参数格式问题

花了一个下午才解决&#xff0c;官方组件文档里面是没有处理方案说明的。 项目版本&#xff1a;Ant Design Vue 2.0.2 前端部分代码&#xff1a; <template><a-modal:visible"visible":width"windowWidth":height"800":title"tit…

【C#学习笔记】匿名函数和lambda表达式

文章目录 匿名函数匿名函数的定义匿名函数作为参数传递匿名函数的缺点 lambda表达式什么是lambda表达式闭包 匿名函数 为什么我们要使用匿名函数&#xff1f;匿名函数存在的意义是为了简化一些函数的定义&#xff0c;特别是那些定义了之后只会被调用一次的函数&#xff0c;与其…

牛客:数对

题目&#xff1a; 解题思路&#xff1a;看到题目的时候&#xff0c;一般第1反应是用两个循环暴力解题&#xff0c;时间复杂度是O(n^2)&#xff0c;不能通过&#xff0c;所以要优化&#xff0c;通过找规律。 一、当 y < k 时&#xff0c; 不可能符合题意&#xff0c;所以 y 从…

Docker容器:dockerfile创建 LNMP 服务+Wordpress 网站平台

文章目录 一.环境及准备工作1.项目环境2.服务器环境3.任务需求 二.Linux 系统基础镜像三.docker构建Nginx1.建立工作目录上传安装包2.编写 Dockerfile 脚本3.准备 nginx.conf 配置文件4.生成镜像5.创建自定义网络6.启动镜像容器7.验证 nginx 四.docker构建Mysql1. 建立工作目录…

PySpark安装及WordCount实现(基于Ubuntu)

先盘点一下要安装哪些东西&#xff1a; VMwareubuntu 14.04&#xff08;64位&#xff09;Java环境&#xff08;JDK 1.8&#xff09;Hadoop 2.7.1Spark 2.4.0&#xff08;Local模式&#xff09;Pycharm &#xff08;一&#xff09;Ubuntu VMware 和 ubuntu 14.04&#xff08;…

android 解决sdk代码冲突

1. 在引用sdk的外面添加排除sdk implementation ("androidx.core:core-ktx:1.9.0"){exclude (group:androidx.appcompat, module:appcompat)} 2. 全局指定对应的sdk版本 configurations.all {resolutionStrategy.eachDependency { DependencyResolveDetails detail…

深度学习loss变为nan的问题

在网上查了一些资料&#xff0c;但是这个情况和网上都不太一样。前100epoch能正常训练&#xff0c;loss缓慢下降&#xff0c;精度缓慢增大&#xff0c;但是突然loss就Nan了&#xff0c;我想应该不是样本问题也不是梯度爆炸或者loss中有除0吧&#xff0c;毕竟都训练了100epoch了…

【DETR】3、Conditional DETR | 拆分 content 和 spatial 来实现对 DETR 的加速

文章目录 一、Conditional DETR 是怎么被提出来的二、Conditional DETR 的具体实现2.1 框架结构2.2 DETR 的 cross-attention 和 Conditional DETR 的 cross-attention 对比 三、效果 论文&#xff1a;Conditional DETR for Fast Training Convergence 代码&#xff1a;https:…

【算法】Java实现KMP算法示例

以下是使用Java实现KMP算法的示例代码&#xff1a; public class KMPAlgorithm {public static void main(String[] args) {String pattern "abc";String text "abcdefabcghi";int[] lps computeLPSArray(pattern);int index search(text, pattern, l…

爬虫逆向实战(二十)--某99网站登录

一、数据接口分析 主页地址&#xff1a;某99网站 1、抓包 通过抓包可以发现登录接口是AC_userlogin 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”可以发现txtPassword和aws是加密参数 请求头是否加密&#xff1f; 无响应是否加密&#xff1f; 无…