前端权限控制

news/2024/7/10 2:24:05 标签: web, vue
webkit-tap-highlight-color: rgba(0, 0, 0, 0);">

1 前端权限控制思路

1.1菜单的控制

​ 在登录请求中,会得到权限数据。前端根据权限数据,展示对应的菜单,点击菜单,才能查看相关的界面

1.2界面的控制

​ 如果用户没有登录,手动在地址栏敲入管理界面的地址,则需要跳转到登录界面

​ 如果用户已经登录,可是手动敲入非权限内的地址,则需要跳转到404界面

1.3按钮的控制

​ 在某个菜单的界面中,还得根据权限数据,展示出可进行操作的按钮,比如删除,修改,增加

1.4请求和响应控制

​ 如果用户通过非常规操作,比如通过浏览器调试工具将某些禁用的按钮变成开启状态,此时发的请求,也应该被前端所拦截


2 Vue的权限控制实现

2.1 菜单的控制

我们点击登录按钮,登陆成功之后,后端除了用户的基本信息外,还有token数据,用于前端用户的状态保持,还会返回用户的权限数据。如下图的对象中的rights数组就是后端返回的权限数据,根据这个权限数据渲染不同的菜单,有一级菜单和二级菜单,可以通过v-for渲染,这个数据可以保存在store中,这样就可以在组件中共享了。
在这里插入图片描述

在这里插入图片描述
但是这样有一个问题,因为要用于渲染菜单的数据存储在store中,当登陆成功之后如果点击了刷新页面,vuex会重新加载,存放数据的数组会变成空数组,这样的话用于渲染菜单的数据就会丢失,菜单就会渲染不出来

  • 刷新界面菜单消失

因为菜单数据是登录之后才获取到的,获取菜单数据之后,就存放在vuex中
一旦刷新界面,Vuex中的数据会重新初始化,所以就会变成空的数组
因此,需要将权限数据存储在sessionStorage中,并让其和vuex中的数据保持同步

解决办法:
这样的话虽然刷新页面Vuex会初始化,但是权限数据列表的初始值会从sessionStorage中获取
注意:要用||做一个判断防止不存在报错
在这里插入图片描述
这样如果点击退出按钮退出的话,需要清除用户数据
先清除sessionStorage中的数据,然后通过lwindow.location.reload()刷新页面清空store中的数据
在这里插入图片描述

2.2 界面的控制

1 正常的逻辑是通过登录界面,登录成功之后跳转到管理平台界面,但是如果用户直接敲入管理平台的地址,也是可以跳过登录的步骤,所以应该在某个时机判断用户是否登录

  • 如何判断是否登录
登录的时候要存储token数据
sessionStorage.setItem('token', res.data.token)
  • 什么时机
    • 路由导航守卫
在router.js文件中
每次路由变化的时候进行监听,to代表去哪一个页面,from代表从哪一个页面来,next是放行函数
router.beforeEach((to, from, next) => {
	if (to.path === '/login') {
	// 访问登录界面,直接放行
		next()
	} else {
	// 访问非登录界面,需要验证是否有token
		const token = sessionStorage.getItem('token')
		if (!token) {
			next('login')
		} else {
			next()
		}
	}
})

2 虽然菜单项已经被控制住了,但是路由信息还是完整的存在于浏览器,正比如一个用户并不具备角色这个菜单,但是他如果在地址栏中敲入/roles的地址,依然可以访问角色界面

  • 路由导航守卫
    路由导航守卫固然可以在每次路由地址发生变化的时候,从vuex中取出权限数据rightlist判断用户将要访问的界面,这个用户到底有没有权限,不过从另外一个角度来说,这个角色不具备权限的路由,是否也应该压根不存在呢?
  • 动态路由
    • 登录成功之后动态添加
    • APP.vue中添加
    • 代码如下
      在router.js中export一个方法用于动态添加路由,通过循环权限数据,然后在router的路由规则routes中添加该用户权限应有的路由信息
      在这里插入图片描述

在登录成功的时候调用router.js中的这个方法
在这里插入图片描述
在这里插入图片描述
如果找不到这个页面的话就会被404页面匹配到
在这里插入图片描述
但是有一个大bug,就是刷新页面的时候,router.js文件会重新加载,那样的话动态路由就会消失,解决办法是在App.vue文件中的created方法中执行添加动态路由方法
在这里插入图片描述

2.3 按钮的控制

按钮控制
虽然用户可以看到某些界面了,但是这个界面的一些按钮,该用户可能是没有权限的,因此,我们需要对组件中的一些按钮进行控制,用户不具备权限的按钮就隐藏或者禁用,而这块中,可以把该逻辑放到自定义指令中

可以参考vue自定义指令
链接

1 在permission.js文件中定义指令
在这里插入图片描述
2 在按钮上使用自定义指令
在这里插入图片描述
在这里插入图片描述

2.4 请求和响应的控制

请求控制

  • 除了登录请求都得要带上token,这样服务器才可以鉴别你的身份
    在封装axios的文件中的请求拦截器中加上token
    在这里插入图片描述

  • 如果发出了非权限内的请求,应该直接在前端访问内阻止,虽然这个请求发送到服务器也会被拒绝
    在这里插入图片描述
    响应控制

  • 得到了服务器返回的状态码401,代表token超时或者被篡改了,此时应该强制跳转到登录界面
    在这里插入图片描述

小结

1 菜单控制

  • 权限的数据需要在多组件之间共享,因此采用vuex
  • 防止刷新界面,权限数据丢失,所以需要存储在sessionStorage,并且要保证两者的同步

2 界面控制

  • 路由的导航守卫可以防止跳过登录界面
  • 动态路由可以让不具备权限的界面的路由规则压根不存在

3 按钮控制

  • 路由规则中可以增加路由元数据meta
  • 通过路由对象可以得到当前的路由规则,以及存储在此规则中的meta数据
  • 自定义指令可以很方便的是心啊按钮控制

4 请求和响应控制

  • 请求拦截器和响应拦截器的使用
  • 请求方式的约定restful

http://www.niftyadmin.cn/n/734912.html

相关文章

iconfont 图标 使用

1 可以使用在线连接,也可以下载到本地 2 在线连接 在assets下的font文件夹下新建iconfont.css文件夹,引入在线链继 在main.js文件中引入iconfont.css文件 3 下载文件 下载到本地后,把压缩包里的css文件拖到assets下的font文件夹下&#x…

无人驾驶的传感器技术

汽车要想获取周围环境数据,就要通过传感器,将环境信息转换为电信号,然后用于计算机分析处理。比如人的五感,就是传感器,其中主要应用的是视觉和听觉,视觉传感器占绝对领先地位。 但是对于汽车,没…

jstat GC情况

2019独角兽企业重金招聘Python工程师标准>>> jstat [Options] vmid [interval] [count] 参数说明: Options 选项,我们一般使用 -gcutil 查看gc情况 vmid VM的进程号,即当前运行的java进程号 interv…

echarts的简单使用

1 引入 官网&#xff1a;https://echarts.apache.org/zh/index.html 可以直接下载&#xff0c;也可以使用npm下载 下载js文件之后引入 2 使用 <body><!-- 准备一个容器div放置图表&#xff0c;会按照容器的大小绘图 --><div id"demo1" style&qu…

String 源码阅读笔记

2019独角兽企业重金招聘Python工程师标准>>> String源码阅读 本人学习笔记&#xff0c;内容来自于阅读源码和其他博客&#xff0c;水平有限&#xff0c;如有错误&#xff0c;烦请指正。 详情参考&#xff1a; Java 7 源码学习系列&#xff08;一&#xff09;——Str…

vue组件name属性

转载自https://www.jb51.net/article/140702.htm 我们在写vue项目的时候会遇到给组件命名 这里的name非必选项&#xff0c;看起来好像没啥用处&#xff0c;但是实际上这里用处还挺多的 export default {name: xxx }用处一&#xff1a;当项目使用keep-alive时&#xff0c;可搭…

分布式服务框架之远程通讯技术及原理分析

在分布式服务框架中&#xff0c;一个最基础的问题就是远程服务是怎么通讯的&#xff0c;在Java领域中有很多可实现远程通讯的技术&#xff0c;例如&#xff1a;RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等&#xff0c;这些名词之间到底是些什么关系呢&#xff0c;它们背…

DispactherServlet请求流程解析(一)

关于DispacherServlet的请求流程&#xff0c;每天都在用&#xff0c;但其内部的细节&#xff0c;了解多少呢&#xff1f; Servlet介绍 DispacherServlet也是Servlet的一种&#xff0c;想弄明白它&#xff0c;对Servlet要有一定的了解。Servlet是一套规范&#xff0c;我们按照规…