位置: IT常识 - 正文

后台管理系统权限管理详解

编辑:rootadmin
后台管理系统权限管理详解 权限管理

推荐整理分享后台管理系统权限管理详解,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

简述权限管理:

你可以在后台通过一个 tree 控件或者其它展现形式给每一个页面动态配置权限,之后将这份路由表存储到后端。当用户登录后得到roles,前端根据roles去向后端请求可访问的路由表,从而动态生成可访问页面,之后就是 router.addRoutes 动态挂载到router 上,你会发现原理是相同的,万变不离其宗。和后台开发时人员商量,能不能在登录之后,把相关权限接口数据返回给我,然后进行菜单的动态展示

前端权限的意义 1降低非法操作的可能性 2.尽可能的排除不必要的请求,减少服务器压力 3.提高用户体验

前端权限控制思路

菜单的控制(管理系统的侧边栏)

在登陆请求中,会得到权限数据。当然,这个需要后台返回的数据的支持,前段根据权限数据,展示对应的菜单,点击菜单,才能查看相关的界面

界面的控制

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

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

按钮的控制

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

请求和响应的控制

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

后台管理系统的权限管理

菜单控制

我现在登录就让后台把路由信息发给我,但是我要用到菜单 页面,这时候我就要使用vuex来共享路由信息;在state中写一个空数组rightList[]接收login页面提交过来的权限数据。映射到菜单页面

当我登陆过后刷新页面时菜单栏消失,为什么?怎么解决

因为当我登陆过后重新加载时,我的vuex也被刷新,但是vuex的初始值我放的是一个空数组,而且此时我们也没有进行那个登陆操作了。所以就导致我的rightList从有数据变成了没数据⇒我渲染的菜单栏消失。

state:{rightList:JSON.parse(sessionStorage.getItem('rightList')||'[]')},mutations:{setRightList(state,data){state.rightList = datasessionStorage.setItem('rightList',JSON.stringify(data))}}

当我点击退出之后,我需要清空sessionStorage和vuex中的数据 在点击登出的这个事件中除了写跳转到登录页面还要写清除操作

logout(){//删除sessionStorage数据sessionStorage.clear()this.$router.push('/login')//删除vuex中的数据,让当前的界面刷新(先跳转再刷新)window.location.reload()}

界面控制

后台管理系统权限管理详解

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

如何判断用户是否登陆

在登录时把后台接口中返回的路由数据中的token存起来,有token就是登录,没就是没登录sessionStorage.setItem('token',res.data.token)

什么时机判断

使用路由导航守卫

router.beforeEach((to,from,next)=>{if(to.path==='/login'){next()}else{const token = sessionStorage.getItem('token')if(!token){next('/login')}else{next()}}})

还有一个问题,当我登陆之后,我在地址栏中敲下一个不属于我的权限界面,我依旧可以进入(例如我是一个普通用户,我不能访问角色管理界面,但是我在地址栏中敲下角色管理的界面地址,我依旧能访问)这如何阻止?

可以依旧在路由导航中继续判断,但是路由导航守卫固然可以在每次路由地址发生变化的时候,从vuex中取出rightList判断用户将要访问的界面,这个用户到底有没有权限.不过从另外一个角度来说,这个用户不具备权限的路由,是否也应该压根就不存在呢?

import store from '@/store' const userRoles= {path:'/users',component:Users} const rolesRoles= {path:'/roles',component:Roles} const goodsRoles= {path:'/goods',component:Goods}const cateRoles= {path:'/categories',component:Categories}、const ruleMapping= {'users':userRoles,'roles':rolesRoles,'goods':goodsRoles,'categories':cateRoles}{path:'/home',component:Home,redirect:'welcome',children:[{path:'/welcome',component:Welcome} //{path:'/users',component:Users} //{path:'/roles',component:Roles} //{path:'/goods',component:Goods}//{path:'/categories',component:Categories}]}export function initDynamicRoutes(){//根据二级权限,对路由规则进行动态的添加const currentRoutes = router.options.routes//遍历二级权限 通过vuex中的store拿到我们的rightList数据const rightList = store.state.rightListrightList.forEach(item=>{item.children.forEach(item=>{//item二级权限,动态添加到childrenconst temp = ruleMapping[item.path]temp.meta = item.rightscurrentRoutes[2].children.push(temp)})})router.addRoutes(currentRoutes)}export default router

登录成功之后动态添加

根据用户所具备的权限,去动态的添加路由规则(还是那个登陆里后台返回的数据)import{initDynamicRoutes }from '@/router.js'initDynamicRoutes()//在这个页面刷新界面之后,//router.js这个页面当然也会重新加载,//此时所有路由初始化,动态路由不复存在,//重新登录成功之后才能使动态路由重新操作//刷新之后我也要动态添加路由规则这个步骤放到app.vue中

在这个页面我刷新界面之后,router.js这个页面当然也会重新加载,此时所有路由初始化,动态路由不复存在,页面空白。重新登录成功之后才能使动态路由重新操作,刷新之后我也要动态添加路由规则

我刷新之后我也要动态添加路由规则,我将这个放到app.vue中的created()生命周期,这样刷新依旧保存了路由规则

App.vueimport{initDynamicRoutes }from '@/router.js'created(){initDynamicRoutes ()}

所以initDynamicRoutes 有两个时机被调用,第一个时机是在登录成功之后被调用,登陆成功之后我在界面上刷新的话,这时候走的时候根组件当中的created的动态添加

按钮控制

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cmjVqZSO-1662525080962)()]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-63kHPIKH-1662525080963)()]

在按钮之上添加一个自指令

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YPMQknaP-1662525080963)()]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ErgwxoV7-1662525080964)()]

<el-button type="primary"@click="addDialogVisible=true" v-permission="{action:'add',effect:'disabled'}">添加</el-button>实现自定义指令=>在utils中写一个permission.js文件实现自定义指令的一个注册import Vue from 'vue'import router from '@/router.js'Vue.directive('permission',{inserted(el,binding){const action = binding.value.action//添加const effect = binding.value.effect//禁用判断当前的路由所对应的组件中,如何判断用户是否具备action的权限呢权限的数据在rightList中;**可以做一件事情=>相关权限获取的判断**clg(router.currentRoute.meta)//看当前组件的路由规则是什么这时候使用meta来增加这个组件这个用户所具备的权限数据,那么对于permission而言就方便很多很多,就可以解决了if(router.currentRoute.meta.indexOf(action)===-1){if(effect==='disabled'){//禁用el.disabled=trueel.classList.add('is-disabled')//ui组件需要用的样式}el.parentNode.removeChild(el) //删除元素button}}})该文件在main.js中进行一个注册:import './utils/permission.js'

请求和响应的控制

请求控制

除登录之外的每一次请求都需要token,这样服务器才能鉴别你的身份。所以在请求拦截器中写

axios.interceptors.request.use(function(req){const currentUrl = req.urlif(currentUrl!=='login'){req.headers.Authorization = sessionStorage.getItem('token')}return req})

如果发出了非权限内的请求,应该直接在前端访问内被阻止,虽然这个请求发到服务器也会被拒绝

import axios from 'axios'import Vue from 'vue'import router from '@router.js'axios.interceptors.request.use(function(req){const currentUrl = req.urlif(currentUrl !=='login'){req.headers.Authorization = sessionStorage.getItem('token')const action = actionMapping[req.method]const currentRight = router.currentRoute.metaif(currentRight&&currentRight.indexOf(action)===-1){//没有权限alert('没有权限')return Promise.reject(new Error('没有权限'))👇🏿}//判断非权限范围内的请求//router.currentRoute.meta//判断当前请求的行为//restful风格请求 👇🏿//get请求 view//post请求 add//put请求 edit//delete请求 delete//[add view edit delete]=>meta中这几种情况 通过请求方式来判断这个请求到底是做什么样的事情,再看一下这个事情在当前路由规则的权限列表内存不存在,不存在就直接阻止掉需要映射关系=>请求方式和操作行为的映射关系const actionMapping = {'get':'view','post':'add','put':'edit','delete':'delete'}}return req})

响应控制

得到了服务器返回的状态码401,代表token超时或者被篡改了,此时应该强制跳转到登录界面

axios.interceptors.response.use((res)=>{if(res.data.meta.status===401){router.push('/login')sessionStorage.clear()window.location.reload()}return res})
本文链接地址:https://www.jiuchutong.com/zhishi/287342.html 转载请保留说明!

上一篇:优酷路由宝不拆机回刷 实现金币倍增的详细教程(优酷路由宝还有用吗)

下一篇:深度学习——VGG16模型详解

  • vivos12耳机孔在哪(vivo手机耳机孔)

    vivos12耳机孔在哪(vivo手机耳机孔)

  • perflogs是什么文件夹可以删除吗(perflogs是什么文件夹打不开)

    perflogs是什么文件夹可以删除吗(perflogs是什么文件夹打不开)

  • 华为 Mate X2有几个摄像头

    华为 Mate X2有几个摄像头

  • 抖音里的歌曲在哪里下载(抖音里歌曲在哪里可以找到完整版)

    抖音里的歌曲在哪里下载(抖音里歌曲在哪里可以找到完整版)

  • 手机淘宝未发货订单怎么申请退款(手机淘宝未发货怎么退款)

    手机淘宝未发货订单怎么申请退款(手机淘宝未发货怎么退款)

  • 苹果定位找不到对方位置(苹果定位找不到设备)

    苹果定位找不到对方位置(苹果定位找不到设备)

  • 荣耀9x支不支持18w快充(荣耀9x支不支持10V4A充电)

    荣耀9x支不支持18w快充(荣耀9x支不支持10V4A充电)

  • 酷狗音乐和酷我音乐有什么区别(酷狗音乐和酷我音乐哪个更好)

    酷狗音乐和酷我音乐有什么区别(酷狗音乐和酷我音乐哪个更好)

  • 笔记本能连wifi吗(笔记本能连wifi手机连不上)

    笔记本能连wifi吗(笔记本能连wifi手机连不上)

  • 手机售后换屏就能保证是原装的吗(手机售后换屏就不保修吗)

    手机售后换屏就能保证是原装的吗(手机售后换屏就不保修吗)

  • 快手评论图片怎么看不见(快手评论图片怎么发)

    快手评论图片怎么看不见(快手评论图片怎么发)

  • 为什么mp4显示文件格式不支持(为什么mp4显示文件格式不支持音乐)

    为什么mp4显示文件格式不支持(为什么mp4显示文件格式不支持音乐)

  • 华为p20有没有耳机孔(华为p20手机怎么开启耳机功能)

    华为p20有没有耳机孔(华为p20手机怎么开启耳机功能)

  • 手机微信来电不反应(手机微信来电不响铃怎么回事)

    手机微信来电不反应(手机微信来电不响铃怎么回事)

  • 荣耀v30是集成5g吗(荣耀v30是不是集成5g)

    荣耀v30是集成5g吗(荣耀v30是不是集成5g)

  • 淘宝动态评分多久更新(淘宝动态评分多久清零)

    淘宝动态评分多久更新(淘宝动态评分多久清零)

  • iphone xs双卡功能(苹果xs实现双卡双待)

    iphone xs双卡功能(苹果xs实现双卡双待)

  • 苹果手机怎么除尘(苹果手机怎么除了联系人以外的所有电话都屏蔽)

    苹果手机怎么除尘(苹果手机怎么除了联系人以外的所有电话都屏蔽)

  • dos是系统软件吗(dos是系统软件吗?)

    dos是系统软件吗(dos是系统软件吗?)

  • 鼠标坏了怎么修

    鼠标坏了怎么修

  • xshare设备是什么(share 设备)

    xshare设备是什么(share 设备)

  • 手机变黑白怎样调换过来(手机变黑白怎样调回来)

    手机变黑白怎样调换过来(手机变黑白怎样调回来)

  • 显示控制面板无法更改显示设置(显示控制面板无法更改设显示设置)

    显示控制面板无法更改显示设置(显示控制面板无法更改设显示设置)

  • 华为手机蓝牙传输记录在哪(华为手机蓝牙传送照片到苹果手机)

    华为手机蓝牙传输记录在哪(华为手机蓝牙传送照片到苹果手机)

  • JS日期与字符串相互转换(时间格式化YYYY-MM-DD,Dayjs的使用)(js日期字符串转换为指定格式的日期)

    JS日期与字符串相互转换(时间格式化YYYY-MM-DD,Dayjs的使用)(js日期字符串转换为指定格式的日期)

  • Vue实现生成二维码(vue生成二维码分享)

    Vue实现生成二维码(vue生成二维码分享)

  • 【Linux】信号的保存(linux信号的本质)

    【Linux】信号的保存(linux信号的本质)

  • 息税前利润怎么算
  • 对公帐户退款
  • 未开发票如何确认收入并进行申报
  • 前期费用包括哪些,占总投资的比例
  • 记账凭证银行利息该怎么记凭证
  • 金税盘没有及时清卡怎么办
  • 月中入职新公司社保谁交
  • 小规模税收优惠政策1%到什么时候
  • 技术服务费怎么开票税率
  • 税务稽查增值税
  • 印花税,车船税通过应交税金科目吗
  • 房产公司收到的增值税
  • 出租设备应计入什么科目
  • 总公司调到子公司
  • 通行费发票如何开具
  • 未抵扣的进项税可以留底多久
  • 店内上保险退保
  • 准予抵扣的进项税额有哪些
  • 30万的营业额20%是多少
  • 进项税和销项税借贷方向
  • 车票进项税可以跨年抵扣吗
  • 先收钱后开票怎么做分录
  • 变更经营范围要什么资料
  • 第三方要求
  • 工程结算收入以前年度多结转收入怎么处理?
  • 贴现到期不获付款
  • 报纸公示具有什么法律效应
  • 进货的运费怎么计算
  • 小规模纳税人销售自己使用过的汽车
  • 电脑安全系统无法启动怎么办
  • 最早遥控器是谁发明的
  • 销售费用的类型
  • 问题解决能力
  • 房产税城镇土地使用税申报期限
  • 超级本轻薄本
  • 损益类科目怎么结转
  • 将自产的应税消费品用于连续生产应税消费品
  • 补缴税款后还能退税吗
  • yolov3图像识别
  • gpt gtp
  • vue2vue3的区别
  • 使用命令查看
  • 公司间代收款需要开票吗
  • 企业小微企业贷逾期起诉法人房子会被拍卖吗?
  • ps像素分辨率什么意思
  • java如何导出
  • 节日购买什么礼物发放职工
  • 去年多计提的工资今年怎么冲
  • 发票冲红后报税有影响吗
  • 一般纳税人申请条件
  • 建筑安装工人住宿费会计分录
  • sqlserver2005 TSql新功能学习总结(数据类型篇)
  • 专票抵扣进项税额怎么填申报表呢
  • 向客户收取服务费会计分录
  • 企业固定资产纳税
  • 发票抬头开个人可以吗?
  • 应交增值税结转账务处理
  • 应收账款的明细科目一般按照什么设置
  • 有限合伙企业需要缴纳企业所得税吗
  • 年金现值的公式是怎么推导出来的
  • 哪些凭证是有效凭证
  • 如何正确设置会员账号
  • sqlserver关键字附近有语法错误
  • mysqld mysql
  • sql命令语句
  • sql刷新快捷键
  • win预览版计划
  • mac怎么共享wifi密码给iphone
  • red hat linux怎么用
  • centos 6.6安装教程
  • win8的ie打开马上闪退
  • macbook新手
  • Win10 Mobile 10586.36在Lumia640 XL中的体验 很流畅
  • gzip与zip
  • win7系统计算机管理打不开
  • unity3d摄像头
  • 一个android项目一般包含哪些目录?各有什么用途?
  • jquery动态添加的元素怎么添加事件
  • 餐饮商家怎么开通抖音团购
  • 广东电子税务局官网登录入口手机版
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设