位置: IT常识 - 正文

前端权限控制(一):前端权限管理及动态路由配置方案(前端权限控制实战)

编辑:rootadmin
前端权限控制(一):前端权限管理及动态路由配置方案 权限控制

推荐整理分享前端权限控制(一):前端权限管理及动态路由配置方案(前端权限控制实战),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:前端权限控制怎么做,前端权限控制按钮,前端权限控制,前端权限控制方案,前端权限控制实战,前端权限控制,前端权限控制面试题,前端权限控制面试题,内容如对您有帮助,希望把文章链接给更多的朋友!

在项目中,尤其是在后台管理系统中,不同人员登陆,看到的页面菜单是不一样的,比如,一个公司的办公系统,超级管理员登陆可以看到所有的页面,而普通员工账号登录可能无法看到人员管理等页面,比如公司的员工个人资料页面只有人力资源部门有权利看,其他部门的员工是不允许查看公司员工信息数据的。当然了除了页面的权限,还会有一些按钮级别的权限,比如一个下载按钮,有的帐号可以用,有的人不能用,比如人员账号管理中,一个页面中有一个确认添加、删除该账号人员按钮,这个按钮只有管理员有权利点击,其他人员登陆是无法点击的。

页面级权限控制

当前系统方案为:前端路由信息完全写死,并且动态生成页面菜单。自己本身的router.js文件定义好页面所有的路由。这种方式弊端很明显,并不能实现真正的权限控制,因为如果用户记住了某个理由,用户不点击菜单,直接在地址栏里输入地址,那么页面还是可以显示出来。

所有方案前提:登录成功后后台返回当前登录用户权限code(或者name、role,名称沟通后自定义),前端存储在vuex中。

方案一:

前端只在路由跳转时做权限判断。

方案一改动当前代码量最小,无需后端改动,前端路由和侧边栏显示不变,在对需要权限区分的路由在跳转时候添加前置路由守卫router.beforeEach,进行当前权限判断,不满足权限的跳转到相应页面(自定义401、404页面等),但该方案不能实现真正的权限控制。

router.beforeEach((to, from, next) => {    if (store.getters.roles.length === 0) { // 判断是否保存有权限信息      const roles = store.getters.roles;      if (roles !== 'admin') { // 不为管理员        if (to.path === '/faultInfo') {          next({ path: '/401' })        } else {          next()        }              } else {        next()      }    } else {      next('/login');    }});方案二:

后端返回路由权限名,前端存储完整路由权限表,并动态生成路由。

建议看大神的文档,已经写的很详细了:手摸手,带你用vue撸后台 系列二(登录权限篇) - 掘金

以下是自己实现思路:

建议登录login和返回用户路由信息get_user_info两件事分开请求比较好。

步骤:

·  登录:当用户填写完账号和密码后向服务端验证是否正确,验证通过之后,服务端会返回一个token,拿到token之后(将这个token存贮到cookie中,保证刷新页面后能记住用户登录状态),前端会根据token再去拉取一个 user_info 的接口来获取用户的详细信息(如用户权限,用户名等等信息)。

前端权限控制(一):前端权限管理及动态路由配置方案(前端权限控制实战)

·  权限验证:通过token获取用户对应的 role,动态根据用户的 role 算出其对应有权限的路由,通过 router.addRoutes 动态挂载这些路由。

数据和操作都可存储至vuex全局管理。(刷新页面后 vuex的内容也会丢失,所以需要重复get_user_info的操作)

权限控思路:前端会有一份路由表,它表示了每一个路由可访问的权限。当用户登录之后,通过 token 获取用户的 role ,动态根据用户的 role 算出其对应有权限的路由,再通过router.addRoutes动态挂载路由。

创建vue实例的时候将vue-router挂载,但这个时候vue-router挂载一些登录或者不用权限的公用的页面。当用户登录后,获取用role,将role和路由表每个页面的需要的权限作比较,生成最终用户可访问的路由表。调用router.addRoutes(store.getters.addRouters)添加用户可访问的路由。使用vuex管理路由表,根据vuex中可访问的路由渲染侧边栏组件。

方案二开始,路由分为两种:constantRoutes 和 asyncRoutes。

constantRoutes: 代表那些不需要动态判断权限的路由,如登录页、404、等通用页面。

asyncRoutes: 代表那些需求动态判断权限并通过 addRoutes 动态添加的页面。

//固定路由const constantRoutes  = [  {    path: '/',    redirect: '/login',  },  {    path: '/login',    name: '登录页面',    component: ()=>import("@/views/login.vue")  },  {    path: '/404',    name: '404页面',    component: ()=>import("@/views/404.vue")  },  {    path: '/401',    name: '401页面',    component: ()=>import("@/views/401.vue")  },]

需要权限路由:字段roles,表示当前路由所需要的权限。

// 需要权限路由export const asyncRoutes = [  {    path: '/permission',    name: 'permissionhome',    meta: {      icon: 'el-icon-setting',      roles: ['admin','superadmin']    },    component: ()=>import("@/views/permission.vue") }, {    path: '/detail',    name: 'detail',    meta: {      icon: 'el-icon-setting',      roles: ['superadmin']    },    component: ()=>import("@/views/detail.vue") },

使用addRoutes方法动态添加路由并进行权限判断:

// main.jsconst whiteList = ['/login'] // 免登陆页面router.beforeEach((to, from, next) => {  if (store.getters.token) { // 判断是否有token    if (to.path === '/login') {      next({ path: '/' });    } else {      if (store.getters.roles.length === 0) { // 判断用户是否游user_info信息        store.dispatch('GetInfo').then(res => { // 获取info          const roles = res.data.role;          store.dispatch('GenerateRoutes', { roles }).then(() => { // 生成可访问的路由表            router.addRoutes(store.getters.addRouters) // 动态添加可访问路由表           next({ ...to, replace: true }) // hack方法 确保addRoutes已完成        }).catch(err => {          console.log(err);        });      } else {        next() //当有用户权限的时候,说明所有可访问路由已生成 如访问没权限的全面会自动进入404页面      }    }  } else {    if (whiteList.indexOf(to.path) !== -1) { // 在免登录白名单,直接进入      next();    } else {      next('/login'); // 否则全部重定向到登录页    }  }});方案三:

登陆成功之后直接由后端返回异步路由表,然后前端直接通过addRoutes方法添加。前端添加用户页面权限配置页面。

实现方式应该跟方案二差不多,具体实现还需跟后端人员沟通讨论。

实现步骤:前端权限控制(二):VUE-router.addRoutes根据后台接口传递数据生成动态路由,前端拿到配置并生成侧边栏-实现页面级权限控制

按钮级权限控制方案一:

在获取到用户的role之后,在前端用v-if手动判断来区分不同权限对应的按钮的。或者将它封装成一个自定义指令使用。

方案二:

在页面级权限控制方案三基础上来操作,后端返回异步路由表中添加页面按钮权限字段,前端根据返回表来显示操作按钮。

具体实现:前端权限控制(三):根据后台接口数据传递页面按钮权限-实现按钮级权限控制

方案三:

不同权限的用户显示不同的侧边栏和限制其所能进入的页面,后端验证每一个涉及请求的操作,验证其是否有该操作的权限,每一个后台的请求 get 或者 post 前端都在请求 header里面携带用户的 token,后端根据该 token 来验证用户是否有权限执行该操作。若没有权限则抛出一个对应的状态码,前端检测到该状态码,做出相对应的操作。

本文链接地址:https://www.jiuchutong.com/zhishi/300273.html 转载请保留说明!

上一篇:基于Web的疫情防控管理系统(基于web的疫情防控方案)

下一篇:微信小程序 | 人脸识别的最终解决方案(微信小程序人民法院审核通过多久立案)

  • 苹果手表有nfc功能吗(苹果手表nfc功能是什么意思)

    苹果手表有nfc功能吗(苹果手表nfc功能是什么意思)

  • 微信交医保怎么查询缴费凭证(微信交医保怎么操作)

    微信交医保怎么查询缴费凭证(微信交医保怎么操作)

  • 苹果手机抖音收藏在哪里找(苹果手机抖音收货地址怎么修改)

    苹果手机抖音收藏在哪里找(苹果手机抖音收货地址怎么修改)

  • 为啥用微信号搜索不到(为啥用微信号搜不到好友)

    为啥用微信号搜索不到(为啥用微信号搜不到好友)

  • 微信个性签名怎么设置(微信个性签名怎么隐藏不让别人看见)

    微信个性签名怎么设置(微信个性签名怎么隐藏不让别人看见)

  • 小米麦克风没声音怎么设置(小米麦克风没声音)

    小米麦克风没声音怎么设置(小米麦克风没声音)

  • 手机充电次数(手机充电次数是什么意思)

    手机充电次数(手机充电次数是什么意思)

  • 历史下载记录在哪儿(以前下载记录)

    历史下载记录在哪儿(以前下载记录)

  • cdy an00是什么型号(cdyan00是什么型号,市场价)

    cdy an00是什么型号(cdyan00是什么型号,市场价)

  • 华为nova6处理器是多少(华为nova6处理器和p40一样吗)

    华为nova6处理器是多少(华为nova6处理器和p40一样吗)

  • 虚拟存储器的最大容量是由什么决定的(虚拟存储器的最大容量)

    虚拟存储器的最大容量是由什么决定的(虚拟存储器的最大容量)

  • 华为手机呼吸灯怎么关(华为手机呼吸灯在哪里设置方法)

    华为手机呼吸灯怎么关(华为手机呼吸灯在哪里设置方法)

  • qq说说删了名片上还显示(qq说说删掉)

    qq说说删了名片上还显示(qq说说删掉)

  • 钉钉手机和电脑怎么同时使用(钉钉手机和电脑为什么不能同步)

    钉钉手机和电脑怎么同时使用(钉钉手机和电脑为什么不能同步)

  • powerpoint无法使用笔(powerpoint无法打开)

    powerpoint无法使用笔(powerpoint无法打开)

  • vivo恢复出厂设置后,激活需要密码怎么办?(vivo恢复出厂设置密码多少)

    vivo恢复出厂设置后,激活需要密码怎么办?(vivo恢复出厂设置密码多少)

  • 火苗火力是怎么得的(火苗和火力有什么区别)

    火苗火力是怎么得的(火苗和火力有什么区别)

  • 苹果手机imessage信息是什么意思(苹果手机imessa短信怎么打开)

    苹果手机imessage信息是什么意思(苹果手机imessa短信怎么打开)

  • 荣耀9x头一次充电充多长时间(荣耀9x头一次充电要多久)

    荣耀9x头一次充电充多长时间(荣耀9x头一次充电要多久)

  • 一加卡券卸载了怎么办(一加卡券app不能安装)

    一加卡券卸载了怎么办(一加卡券app不能安装)

  • 荣耀9x出厂带膜吗(荣耀9x出厂膜需要换吗)

    荣耀9x出厂带膜吗(荣耀9x出厂膜需要换吗)

  • iPhone XR支持横屏吗(iphonexr可以横屏显示嘛)

    iPhone XR支持横屏吗(iphonexr可以横屏显示嘛)

  • 怎么用vivo手机给mp3下歌(nfc功能怎么用vivo手机)

    怎么用vivo手机给mp3下歌(nfc功能怎么用vivo手机)

  • 苹果xr双卡如何交替使用(苹果xr双卡如何切换发信息号码)

    苹果xr双卡如何交替使用(苹果xr双卡如何切换发信息号码)

  • 如何用WPS表格制作签到表(如何用wps表格制作双柱形图)

    如何用WPS表格制作签到表(如何用wps表格制作双柱形图)

  • 视频监控 智能交通 数据集(目标检测、跟踪)(视频监控智能化应用)

    视频监控 智能交通 数据集(目标检测、跟踪)(视频监控智能化应用)

  • 2023年highway-env更新之后的使用记录(含DDQN,DuelingDQN,DDQN+OtherChanges) 入门到入土,再踩坑就不玩原神了

    2023年highway-env更新之后的使用记录(含DDQN,DuelingDQN,DDQN+OtherChanges) 入门到入土,再踩坑就不玩原神了

  • discuz如何开发关注功能(discuzq开发)

    discuz如何开发关注功能(discuzq开发)

  • 车辆租赁费发票备注栏怎么写
  • 主营业务税金及附加怎么算
  • 预付款可以抵扣进度款吗
  • 餐饮业申请发票
  • 税控盘解锁是什么意思
  • 增值税专用发票和普通发票的区别
  • 一次性奖金并入综合所得
  • 临时工工资能否用公户支付
  • 车辆购置税退税流程
  • 公司给客户退款会计分录
  • 基金会可以投资企业吗
  • 境外企业在境外提供劳务
  • 租房合同开发票的金额要和合同一致吗
  • 收到增值税发票怎么记账
  • 金税盘基本信息设置
  • 发票勾选了是否就抵扣了
  • 主营业务利润计算
  • 存货折扣怎样做账
  • 在win10系统中,如何限制孩子玩原神游戏
  • 提取利润会计分录怎么做
  • 重装系统D盘文件还能恢复吗
  • 电脑主板bios设置
  • win10右键显示设置打不开怎么办
  • 增值税电子发票有什么用
  • 修改插入点闪烁光标的宽度
  • rteng7.exe - rteng7是什么进程 有什么用
  • 出口企业如何确认增值税收入
  • 源码阅读技巧
  • mapbox wms
  • array php
  • 购进设备抵扣税额
  • 费用报销单怎样粘贴
  • 原生php和框架php的区别
  • file读取文件内容
  • 企业购进固定资产,在安装完工交付使用时
  • 给第三方的销售怎么做
  • 银行本票怎么办理转账
  • 紫白择日法实例详解
  • 增值税发票真假怎么查询
  • 小规模纳税人做工资没交社保
  • 金税四期能监控到公户吗
  • 损益类科目调整到未分配利润分录
  • 在建工程什么意思
  • 把上级机关来文转给下级机关的通知
  • 债权投资减值准备是什么科目
  • 贴现利息高好还是低好
  • 税法对企业费用的限定
  • 其他应收款押金的现金流量
  • 电子记录表怎么填写
  • 机器设备进项税率
  • 实物投资的会计科目
  • 增值税专用发票的税率是多少啊
  • sql数据库怎么执行命令
  • sqlserver2000怎么用
  • Linux系统忘记root密码
  • centos下载命令
  • win7旗舰系统
  • 系统死锁或资源管理器崩溃时让xp系统自动重启的方法
  • ubuntu系统安装SSH服务
  • windows任务栏变色
  • excel2016 win7
  • Win10系统安装步骤
  • 适配器模型
  • 一个简单的灵魂
  • unity 数学
  • Unity3D AsssetBundle加载效率比较
  • jquery动态添加的元素怎么添加事件
  • node 多线程
  • 从零开始学公文写作
  • android下载文件保存到本地
  • JavaScript isPrototypeOf和hasOwnProperty使用区别
  • ca登陆
  • 山东省税务局在哪
  • 国家税务总局办税指南
  • 国家税务总局监控的重点税源纳税人的标准是
  • 税务局三方协议变更
  • 水上公安分局
  • 企业年金个人缴纳的辞职能拿吗
  • 出成效的意思
  • 电子秒表怎么读数9:33.12
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设