当前位置: 首页 > news >正文

权限管理实现的两种方式(详解)

登录的接口请求的三个内容:
1. token
2. 用户信息、角色信息
3. 菜单信息

第一种:基于角色Role的动态路由管理 (不推荐,但市场用的比较多)

首先列出枚举每个角色对应几个路由,然后根据用户登录的角色遍历枚举出来的角色动态注册对应的路由

const roles = {admin:['所有路由'],'经理':['10个路由'],'运营':['5个路由'],'前台':['2个路由']'新增一个角色':[xxx] ===>改代码重新发布版本
}

这种做法一个弊端:每添加一个角色,都要手动添加代码key:value。最后前端又要发布新的版本(有解决方案如下)

这种方法大致流程如下:

登录:登录验证通过之后后台会返回一个token给前端,前端会保存在vuex和本地(防止刷新丢失登录状态),然后拿token去后台请求一个userInfo的接口获取用户信息(用户名,权限信息等等)

权限验证:通过token获取用户role信息,然后根据用户role算出对应应有权限信息的路由,最后用router.addRotes动态挂载计算出的路由。

代码的实现:

根据token拿到用户信息(权限信息)

这里代码过于简单就不写了,就是请求后台的数据而已。

请求回来的数据保存在Vuex当中(actions发请求----mutations传数据给state,过程不书写了)

//箭头函数
const getDefaultState = () => {return {//获取tokentoken: getToken(),//存储用户名name: '',//存储用户头像avatar: '',//服务器返回的菜单信息【根据不同的角色:返回的标记信息,数组里面的元素是字符串】routes: [],//角色信息roles: [],//按钮权限的信息buttons: [],}
}

vuex查看数据:保存成功

Router中路由的拆分(现在路由是全部注册好的,写死的,不管什么用户看的都是一样的页面。)

分为三类路由:

  1. 常量路由,不管什么角色都可以看得路由

  1. 任意路由:路径出错的时候重定向404

  1. 异步路由:不同角色需要过滤选出路由(根据后台的返回的角色计算出对呀的路由)

store/user.js中对比路由

首先要在state定一个计算好的路由变量resultAsyncRoutes:[] 和一个最终合并展示路由变量resultAllRputes:[]

在获取用户信息的时候异步路由和服务器返回的路由进行对比。commit要提交对比好的路由,所有写一个对比路由函数。computedAsyncRoutes()函数第一个参数是异步路由,第二个是服务器返回的路由。

在actions外面定义一个对比路由的computedAsyncRoutes函数:

//定义一个函数:两个数组进行对比,对比出当前用户到底显示哪些异步路由
const computedAsyncRoutes = (asyncRoutes, routes) => {//过滤出当前用户【超级管理|普通员工】需要展示的异步路由return asyncRoutes.filter(item => {//数组当中没有这个元素返回索引值-1,如果有这个元素返回的索引值一定不是-1 if (routes.indexOf(item.name) != -1) {//递归:别忘记还有2、3、4、5、6级路由if (item.children && item.children.length) {item.children = computedAsyncRoutes(item.children, routes);}return true;}})
}

commit的时候对比好路由(需要深拷贝一下,不然对比后数据影响原数据)

打印异步路由和服务器返回的路由:

然后在mutations中合并路由(计算出来的异步路由,常量路由,任意路由进行合并)用router.addRotes动态挂载计算出的路由。

根据计算出路由展示菜单

目前为止路由都准备好了,但是侧边栏展示还是常量路由,侧边栏应该遍历vuex合并好的路由resultAllRputes

在Sidebar组件中:

这样侧边栏就这根据权限动态展示了。

按钮权限:

菜单权限:不同的用户(角色),能操作、能观看的菜单是不同的。

按钮的权限:不同的用户(角色),有的用户的是可见按钮、当然有的用户不可见。

实现方式也比较简单:根据后台返回button是否有这个按钮的权限值。

用v-if去判断后台返回buttons是否包含该按钮的权限,没有就不显示。

<template><div><el-button type="primary" v-if="$store.state.user.buttons.indexOf('btn.Add1')!=-1">添加按钮1</el-button><el-button type="primary"  v-if="$store.state.user.buttons.indexOf('btn.Add2')!=-1">添加按钮2</el-button></div>
</template>

第二种:基于菜单Menu的动态路由管理(推荐)

我这里是从0搭建的,很多细节需要自己处理,看起来比上面的方法麻烦其实不是这样的,上面是使用vue-admin很多细节作者已经处理好了,我这里需要自己处理,也更好的理解各种细节问题。

  • userMenus =>动态展示菜单

  • 用户管理 ----商品管理----角色管理等等这些路由模块映射成一个对象然后和后端返回这个角色的菜单信息进行对比,然后用Router.addRotes的API动态注册路由。

大致流程:(Vue3+TS+pinia实现)

这里的后台和上面的返回格式不一样,问题也不大。首页还是拿到token,用token拿用户信息,用户信息中有用户id,那个用户id去后台拿菜单信息。

后台返回的菜单信息:

然后对路由进行划分:

对比一下他们的路由信息:

然后进行路由对比,对比好就动态注册路由,要点击登录前就要计算好路由,也就是说push到首页就要算好路由,所有在login中actions进行对比,但是这个逻辑比较多,为了方便管理对比路由函数写在utils

在utils中:

这里用了两个for循环因为这里明确知道两次目录,要是children两层以上可以用递归

在login中actions使用:

计算好的路由放到routes数组中,然后forEach遍历用router.addRoute动态添加路由(addRoute第一个参数是目标路由,第二个参数就是路由信息,代码上的意思就是将遍历出来的路由信息添加main的children下面)

目前效果可以做到点击菜单路由也可以跟着改变了

但是目前有一个问题就是,我注册权限路由是pinia的actions在点击登录按钮的回调进行注册的,现在当我刷新的时候这些路由就访问不到了,只能访问不用权限的路由,为什么会这样?

因为刷新不会重新加载pinia的actions的登录的回调,只有点击登录才会执行,解决办法就是刷新让这个回调重新执行一遍。具体实现如下:

  1. 在actions在定一个函数

函数定义好了,要让他刷新执行一遍,需要在main执行(顺序比较重要批念必须先加载,然后再动态注册权限路由,最后加载router)

第一个页面的匹配方法:

现在做一个小细活,就是登录完立刻重定向到第一个页面(这个需要动态的,不是每个角色第一个页面都是一样的)

在那个utils中的mapMenusToRouters函数增加两句代码

然后再router里面的前置守卫使用

根据path匹配menu

现在点击部门管理刷新会跳转到一点页面,我们要的还是留在部门管理这个路由

在nav-menu组件组件中:

计算出defaultActive

在utils写工具函数

大致流程就是这样了。

文章有帮助到您帮忙点个赞赞~~~

相关文章:

权限管理实现的两种方式(详解)

登录的接口请求的三个内容&#xff1a;1. token2. 用户信息、角色信息3. 菜单信息第一种&#xff1a;基于角色Role的动态路由管理 (不推荐&#xff0c;但市场用的比较多)首先列出枚举每个角色对应几个路由&#xff0c;然后根据用户登录的角色遍历枚举出来的角色动态注册对应的路…...

【C++】智能指针思路解析和模拟实现

此篇文章就从以下几个方面出发&#xff0c;带你了解智能指针的方方面面1.为什么需要智能指针当我们开辟内存并使用的时候&#xff0c;我们的顺序应该是这样&#xff1a;开辟内存-》使用内存-》释放内存问题就出现在第三步&#xff0c;开辟好了&#xff0c;也使用了&#xff0c;…...

SpringCloud(18):Sentinel流控降级入门

Sentinel本地应用流控降级实现分为三步: 创建本地应用搭建本地Sentinel控制台本地应用接入本地Sentinel控制台1 本地应用创建 整体流程分析 创建springboot项目在项目的pom.xml文件中引入sentinel-core的依赖坐标创建TestController,定义使用限流规则运行测试具体流程 1.创…...

C++【多态】

文章目录1、多态的概念2、多态的定义及实现2-1、多态的构成条件2-2、虚函数2-3、虚函数的重写2-4 多态样例2-5、协变2-6、 析构函数与virtual2-7、函数重载、函数隐藏&#xff08;重定义&#xff09;与虚函数重写&#xff08;覆盖&#xff09;的对比2-8、override 和 final&…...

缓存预热、缓存雪崩、缓存击穿、缓存穿透,你真的了解吗?

缓存穿透、缓存击穿、缓存雪崩有什么区别&#xff0c;该如何解决&#xff1f; 1.缓存预热 1.1 问题描述 请求数量较高&#xff0c;大量的请求过来之后都需要去从缓存中获取数据&#xff0c;但是缓存中又没有&#xff0c;此时从数据库中查找数据然后将数据再存入缓存&#xf…...

【Java基础】018 -- 面向对象阶段项目上(拼图小游戏)

目录 拼图小游戏&#xff08;GUI&#xff09; 一、主界面分析 1、练习一&#xff1a;创建主界面1 2、练习二&#xff1a;创建主界面2&#xff08;JFrame&#xff09; 3、练习三&#xff1a;在游戏界面中添加菜单&#xff08;JMenuBar&#xff09; ①、菜单的制作 4、添加图片&a…...

【网络~】

网络一级目录二、socket套接字三、UDP数据报套接字四、TCP流套接字一级目录 1.局域网、广域网 2.IP地址是什么&#xff1f; IP地址是标识主机在网络上的地址 IP地址是如何组成的&#xff1f; 点分十进制&#xff0c;将32位分为四个部分&#xff0c;每个部分一个字节&#xff…...

手写JavaScript中的call、bind、apply方法

手写JavaScript中的call、bind、apply方法 call方法 call() 方法使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数。 function Product(name, price) {this.name name;this.price price; }function Food(name, price) {Product.call(this, name, price);t…...

JAVA练习46-将有序数组转换为二叉搜索树

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 2月10日练习内容 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、题目-…...

linux(centos7.6)docker

官方文档&#xff1a;https://docs.docker.com/engine/install/centos/1安装之前删除旧版本的docker2安装yum install-y yum-utils3配置yum源 不用官网的外国下载太慢 推荐阿里云yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.r…...

微信小程序滚动穿透问题

文章目录1、catchtouchmove"true"2、page-meta3、wx.setPageStyle做小程序的开发业务中&#xff0c;经常会使用弹窗&#xff0c;当弹窗里的内容过多时&#xff0c;要滚动查看&#xff0c;然后经常会遇到滚动弹窗&#xff0c;弹窗底下页面也跟着滚。解决思路&#xff…...

安全—06day

负载均衡反向代理下的webshell上传负载均衡负载均衡下webshell上传的四大难点难点一&#xff1a;需要在每一台节点的相同位置上传相同内容的webshell难点二&#xff1a;无法预测下一次请求是哪一台机器去执行难点三&#xff1a;当我们需要上传一些工具时&#xff0c;麻烦来了&a…...

PostgreSQL入门

PostgreSQL入门 简介 PostgreSQL是以加州大学伯克利分校计算机系开发的POSTGRES&#xff0c; 版本 4.2为基础的对象关系型数据库管理系统&#xff08;ORDBMS&#xff09; 支持大部分SQL标准并且提供了许多现代特性 复杂查询外键触发器可更新视图事务完整性多版本并发控制 …...

自媒体人都在用的免费音效素材网站

视频剪辑、自媒体人必备的剪辑音效素材网站&#xff0c;免费下载&#xff0c;建议收藏&#xff01; 1、菜鸟图库 音效素材下载_mp3音效大全 - 菜鸟图库 菜鸟图库是一个综合性素材网站&#xff0c;站内涵盖设计、图片、办公、视频、音效等素材。其中音效素材就有上千首&#xf…...

Java数据结构中二叉树的深度解析及常见OJ题

本篇文章讲述Java数据结构中关于二叉树相关知识及常见的二叉树OJ题做法讲解&#xff08;包含非递归遍历二叉树&#xff09; 目录 一、二叉树 1.1二叉树概念 1.2特殊的二叉树 1.3二叉树性质 1.4二叉树基本性质定理题 1.5二叉树遍历基本操作 1.6二叉树遍历的前中后非递归写法 1.7…...

算法顶级比赛汇总

可参赛的算法比赛 阿里云天池大数据竞赛 时间&#xff1a;每年各个季度很多类型都会出题&#xff08;比赛总时间大概为两个月&#xff09; 内容&#xff1a;各个类型的算法题都会出、奖金上万不等 形式&#xff1a;在线提交&#xff08;提交后在线检查结果&#xff09;、离线…...

Android MVI框架搭建与使用

MVI框架搭建与使用前言正文一、创建项目① 配置AndroidManifest.xml② 配置app的build.gradle二、网络请求① 生成数据类② 接口类③ 网络请求工具类三、意图与状态① 创建意图② 创建状态四、ViewModel① 创建存储库② 创建ViewModel③ 创建ViewModel工厂五、UI① 列表适配器②…...

第九节 使用设备树实现RGB 灯驱动

通过上一小节的学习&#xff0c;我们已经能够编写简单的设备树节点&#xff0c;并且使用常用的of 函数从设备树中获取我们想要的节点资源。这一小节我们带领大家使用设备树编写一个简单的RGB 灯驱动程序&#xff0c;加深对设备树的理解。 实验说明 本节实验使用到STM32MP1 开…...

Ubuntu 系统下Docker安装与使用

Ubuntu 系统下Docker安装与使用Docker安装与使用Docker安装安装环境准备工作系统要求卸载旧版本Ubuntu 14.04 可选内核模块Ubuntu 16.04 使用 APT 安装安装 Docker CE使用脚本自动安装启动 Docker CE建立 docker 用户组测试 Docker 是否安装正确镜像加速Docker使用拉取镜像创建…...

DHCP安全及防范

DHCP安全及防范DHCP面临的威胁DHCP饿死攻击仿冒DHCP Server攻击DHCP中间人攻击DHCP Snooping技术的出现DHCP Snooping防饿死攻击DHCP Snooping防止仿冒DHCP Server攻击DHCP Snooping防止中间人攻击DHCP Snooping防止仿冒DHCP报文攻击DHCP面临的威胁 网络攻击无处不在&#xff…...

【流畅的python】第一章 Python数据模型

文章目录第一章 Python 数据模型1.1 python风格的纸牌1.2 如何使用特殊方法-通过创建一个向量类的例子1.3 特殊方法汇总第一章 Python 数据模型 python最好的品质是一致性 python解释器碰到特殊句法时&#xff0c;会使用特殊方法去激活一些基本的对象操作 这些特殊的方法以两个…...

from文件突然全部变为类cs右击无法显示设计界面

右击也不显示查看设计器 工程文件 .csproj中将 <Compile Include"OperatorWindows\Connection.cs" /> <Compile Include"OperatorWindows\Connection.Designer.cs"> <DependentUpon>Connection.cs</DependentUpon> &…...

使用arthas中vmtool命令查看spring容器中对象的某个属性

场景&#xff1a; 线上环境我想查看spring中容器某个对象的属性值 vmtool命令 方式一&#xff1a; vmtool --action getInstances -c [类加载器的hash] --className [目标类全路径] --limit 10 -x 2 实例&#xff1a;查询该类的全部属性情况&#xff08;该类是一个spri…...

四种幂等性解决方案

什么是幂等性&#xff1f; 幂等是一个数学与计算机学概念&#xff0c;在数学中某一元运算为幂等时&#xff0c;其作用在任一元素两次后会和其作用一次的结果相同。 在计算机中编程中&#xff0c;一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。 幂等…...

【Nacos】Nacos配置中心客户端配置更新源码分析

上文我们说了服务启动的时候从远程Nacos服务端拉取配置&#xff0c;这节我们来说下Nacos服务端配置的变动怎么实时通知到客户端&#xff0c;首先需要注册监听器。 注册监听器 NacosContextRefresher类会监听应用启动发布的ApplicationReadyEvent事件&#xff0c;然后进行配置…...

按钮防抖与节流-vue2

防抖与节流&#xff0c;应用场景有很多&#xff0c;例如&#xff1a;禁止重复提交数据的场景、搜索框输入搜索条件&#xff0c;待输入停止后再开始搜索。 防抖 点击button按钮&#xff0c;设置定时器&#xff0c;在规定的时间内再次点击会重置定时器重新计时&#xff0c;在规定…...

PyTorch学习笔记:nn.SmoothL1Loss——平滑L1损失

PyTorch学习笔记&#xff1a;nn.SmoothL1Loss——平滑L1损失 torch.nn.SmoothL1Loss(size_averageNone, reduceNone, reductionmean, beta1.0)功能&#xff1a;创建一个平滑后的L1L_1L1​损失函数&#xff0c;即Smooth L1&#xff1a; l(x,y)L{l1,…,lN}Tl(x,y)L\{l_1,\dots,l…...

2年时间,涨薪20k,想拿高薪还真不能老老实实的工作...

2016年开始了我的测试生活。 2016年刚到公司的时候&#xff0c;我做的是测试工程师。做测试工程师是我对自己的职业规划。说实话&#xff0c;我能得到这份工作真的很高兴。 来公司的第一个星期&#xff0c;因为有一个项目缺人&#xff0c;所以部门经理提前结束了我的考核期&a…...

Spark - Spark SQL中RBO, CBO与AQE简单介绍

Spark SQL核心是Catalyst, Catalyst执行流程主要分4个阶段, 语句解析, 逻辑计划与优化, 物理计划与优化, 代码生成 前三个阶段都由Catalyst负责, 其中, 逻辑计划的优化采用RBO思路, 物理计划的优化采用CBO思路 RBO (Rule Based Optimization) 基于规则优化, 通过一系列预定好…...

NeurIPS/ICLR/ICML AI三大会国内高校和企业近年中稿量完整统计

点击文末公众号卡片&#xff0c;找对地方&#xff0c;轻松参会。 近日&#xff0c;有群友转发了一张网图&#xff0c;统计了近年来中国所有单位在NeurIPS、ICLR、ICML论文情况。原图如下&#xff1a; 中稿数100&#xff1a; 清华(1) 北大(2) 占比&#xff1a;22.6%。 累计数…...

做名片哪个网站最好/优化推广方案

本代码由广州75中麻玉国老师分享在NOI教练群内&#xff0c;自己亲测了一下&#xff0c;感觉蛮好玩&#xff0c;所以特意收藏下来&#xff0c;具体代码如下&#xff1a;import pdfplumberfrom openpyxl import Workbookwb Workbook() # 创建文件对象ws wb.active # 获取第一…...

网站怎么做能中英文的/整合营销传播策略

The LaTex packages in CentOS 7 Linux is not sufficient enough. I would like to Install Tex Live such as Tex Live 2016. How could I install it on CentOS 7?CentOS 7 Linux中的LaTex软件包还不够。 我想安装Tex Live&#xff0c;例如Tex Live2016。如何在CentOS 7上安…...

建设网站企业邮箱/网站seo外包公司有哪些

本博文记录阅读《C Primer》过程中遇到的未理解知识点&#xff0c;便于日后回头有针对性的攻克。 教材&#xff1a;《C Primer中文第四版&#xff08;非扫描&#xff09;》 1.第369页有这么一句“。 正如前面第 7.8 节所提到的&#xff0c;当形参以副本传递时&#xff0c;不能基…...

建设网站的企业邮箱网站建设服务/新闻头条 今天

HTML5提供了许多新接口&#xff0c;其中最令人振奋的无疑是Websocket。正是它的存在令网络双向交互得以实现。使用Websocket对于客户端来说无疑十分简单。websocket提供了三个简单的函数&#xff0c;onopen,onclose以及onmessage&#xff0c;顾名思义&#xff0c;他们分别监听s…...

ui界面设计师/网站seo优化的目的

网络工程师成长日记371-卡夫食品中国有限公司项目回忆录 这是我的第371篇原创文章&#xff0c;记录网络工程师行业的点点滴滴&#xff0c;结交IT行业有缘之人 今天&#xff0c;我与老大一起去中大国际&#xff0c;为卡夫食品中国有限公司做项目尽管是项目不大&#xff0c;但第一…...

资源搜索/重庆seo网站推广优化

MVCC(Mutil-Version Concurrency Control)MVCC 是一种多版本并发控制的方法&#xff0c;一般在数据库管理系统中&#xff0c;实现对数据库的并发访问。在Mysql的InnoDB引擎中就是指在已提交读(READ COMMITTD)和可重复读(REPEATABLE READ)这两种隔离级别下的事务对于SELECT操作会…...