精确到按钮级别前端权限管理实现方案

目录
  • 这是产品提出的要求:
    • 旧的按钮权限控制:
    • 解决方案构思:
  • 方案优化
    • 具体实现核心代码

这是产品提出的要求:

页面上的每一个按钮,都要可以通过角色权限来控制

当时的项目背景是一个零售系统的后台管理,所以会涉及到运营、厂家、管理员等等很多角色的使用,而其中许多数据是敏感的,例如销量,单价,利润等。前期的权限仅限于菜单级别的控制,也就是可以通过配置实现可以控制某个角色只显示某些菜单,这也是比较常规的权限处理方案——没权限就不让你看那个页面呗~

旧的按钮权限控制:

//按钮根据角色写死是否有权限,灵活性很差,修改权限需要前端改代码,而且哪个按钮有权限纯靠阅读代码识别
<button disabled={role !== "admin"}>删除</button> //大致代码,角色为admin按钮才可用

但目前的情况是菜单的控制在现有系统的背景下已经略显粗放了,比如有的人是可以看销售页面的,只是不允许他导出,又或者允许他新增一个商品,但是不允许他删除,所以呢要求虽然有点高,但是这个需求无疑是合理的。做过类似系统的朋友都应该了解,后管系统的列表类型页面,往往是增删改查集一体的,甚至还有导出、绑定、上传之类的操作。另一个前提是,实现按钮权限控制的同时之前菜单权限的控制也要保留支持。

解决方案构思:

方案一,既然某些操作是不允许的,是否可以将操作归类统一赋予角色权限呢,比如运营A角色无删除类权限,运营B角色有新增类权限,类似来归类实现管理。可落到实处,会发现操作很难归类,删除和修改其实是类似的,绑定解绑等操作更是无法准确分类;更大的问题是,有的角色是可以的删除A页面数据,但是不允许删除B页面数据的,而且这种方式灵活度也很低,比菜单好不到哪去,所以否掉。

方案二,摒弃按钮分类思想,给每个按钮赋予唯一code用于控制权限,管理角色权限直接勾选该角色是否激活某个code权限即可;拟定一个鉴权函数,入参数为code,该函数放置于每个按钮中,鉴权函数根据code是否在后端返回的该角色拥有code列表中,来判断返回是否具有权限,具有很高的灵活性,并且菜单也可以通过加code来实现同样效果,改动微小几乎只用增加一个鉴权函数即可实现核心逻辑。

方案优化

最终采用方案二,在实际研发中,还做了优化:

1.将权限控制按层级分为模块,菜单,按钮3大层级,因为当整个模块都没有权限的时候,不必再判断按钮权限,提高性能,菜单亦如此。

2.code实际是用英文字符来表示,增强可读性,例如设备菜单是deviceMenu,而不是无意义的id。

3.实际鉴权函数入参为模块,菜单,按钮3个参数,更好理解也更加符合直觉,模块下有多个菜单,菜单下有多个按钮,也就是说几乎每个添加按钮都可以取名“add”,不必担心重复。

4.将列表字段当按钮处理,甚至可以实现同一列表每个字段的权限控制,例如部分敏感价格字段显示为**(当然安全性不高)

5.后端只需返回当前用户角色拥有的全部模块,菜单,按钮code即可

具体实现核心代码

// 给菜单路由增加code标识,后续根据角色拥有菜单情况遍历剔除无权限菜单即可
    	{
    		path: 'model',
    		name: 'DeviceModelList',
    		code: 'device_model',//  菜单仅在原路由增加code,改动很小
    		meta: {
    			title: '设备型号',
    			icon: 'md-menu'
    		},
    		component: () => import('@/views/DeviceModelList')
    	}
// 给按钮增加函数鉴权,此处是采用禁用点击,也可以使用if直接不显示
    <Button:disabled="!checkButtonPower('device','device_list','add')">添加设备</Button>
// 鉴权函数,判断模块和菜单就不用传第二,三个参数即可(当时的代码实在是不够优雅啊)
    checkButtonPower(modelCode, menuCode, buttonCode) {
    let powerStatus = false
    //取出权限列表
    const isGetPower = localStorage.getItem('userPower')
    const powerList = isGetPower ? base64.decryptAsObj(isGetPower) : null
    for (const modes of powerList) {
    	if (!!modes.menuCode && modes.menuCode == modelCode) {
    		for (const menus of modes.childMenu) {
    			if (!!menus.menuCode && menus.menuCode == menuCode) {
    				for (const buttons of menus.buttons) {
    					if (!!buttons.code && buttons.code == buttonCode) {
    						powerStatus = true
    					}
    				}
    			}
    		}
    	}
   	}
   	return powerStatus
   },

至此,功能实现,如有疑问欢迎留言 PS:后续实现后发现Vben-admin也是用的类似的思路实现了细粒度的权限管理,思路没错~~

更多关于按钮级别前端权限管理的资料请关注我们其它相关文章!

(0)

相关推荐

  • 详解VUE前端按钮权限控制

    在用户登陆后,根据用户id读取用户的所有权限数据,放入本地的storage进行存储,之后,定义指令,如果用户含有此按钮权限,则在页面显示出来: /**权限指令**/ Vue.directive('has', { bind: function(el, binding) { if (!Vue.prototype.$_has(binding.value)) { el.parentNode.removeChild(el); } } }); //权限检查方法 Vue.prototype.$_has = f

  • 前端实现滑动按钮AJAX与后端交互的示例代码

    目录 html代码 css代码 效果图 JS事件触发 flask后端接口 参考链接 html代码 <div class="switch-box"> <input id="switchButton" type="checkbox" class="switch" /> <label for="switchButton"></label> </div>

  • vue实现前端按钮组件权限管理

    目录 方案1:数组+自定义指令 关于路由权限 方案2: 二进制 表达权限: 权限判断 判断和使用 小结 方案1:数组+自定义指令 把权限放到数组中,通过vue的自定义指令来判断是否拥有该权限,有则显示,反之则不显示 我们可以把这个按钮需要的权限放到组件上 <el-button v-hasPermi="['home:advertising:update']" >新建</el-button> 自定义指令: 逻辑就是我们在登陆后会获取该用户的权限,并存储到localS

  • Vue 指令实现按钮级别权限管理功能

    在项目中经常有需求要根据用户的权限对界面上的元素进行控制,这里介绍了一直简单的实现,仅供参考. 当前用户的权限列表储存在 store 里,也可以是其他地方. 指令 // src/directives/permission.js import Vue from 'vue'; import store from '@/store'; import {get} from '@/utils'; // 是否有权限 const hasPermission = userPermission => { let

  • 精确到按钮级别前端权限管理实现方案

    目录 这是产品提出的要求: 旧的按钮权限控制: 解决方案构思: 方案优化 具体实现核心代码 这是产品提出的要求: 页面上的每一个按钮,都要可以通过角色权限来控制 当时的项目背景是一个零售系统的后台管理,所以会涉及到运营.厂家.管理员等等很多角色的使用,而其中许多数据是敏感的,例如销量,单价,利润等.前期的权限仅限于菜单级别的控制,也就是可以通过配置实现可以控制某个角色只显示某些菜单,这也是比较常规的权限处理方案——没权限就不让你看那个页面呗~ 旧的按钮权限控制: //按钮根据角色写死是否有权限,

  • Vue 动态路由的实现及 Springsecurity 按钮级别的权限控制

    思路 : 动态路由实现:在导航守卫中判断用户是否有用户信息, 通过调用接口,拿到后台根据用户角色生成的菜单树, 格式化菜单树结构信息并递归生成层级路由表并 使用Vuex保存,通过  router.addRoutes  动态挂载到  router  上,按钮级别的权限控制,则需使用自定义指令去实现. 实现: 导航守卫代码: router.beforeEach((to, from, next) => { NProgress.start() // start progress bar to.meta

  • springboot实战权限管理功能图文步骤附含源码

    目录 前言 功能清单 功能介绍 菜单管理 资源管理 角色管理 后台用户管理 动态菜单控制 动态资源控制 项目源码地址 前言 mall项目的权限管理功能发布啦!权限管理作为后台管理系统的必要功能,mall项目之前的权限管理并不完善.最近我对原先的权限管理进行了重新设计,打造了一套切实可用的权限管理功能. 功能清单 菜单管理:可以实现对后台管理系统左侧菜单的管理,支持更换图标.更换名称.控制菜单显示和排序: 资源管理:实现了基于访问路径的后台动态权限控制,控制的权限可以精确到接口级别: 角色管理:可

  • 详解利用 Vue.js 实现前后端分离的RBAC角色权限管理

    项目背景:物业管理后台,不同角色拥有不同权限 采用技术:Vue.js + Vuex + Element UI 实现 RBAC 权限管理需要后端接口支持,这里仅提供前端解决方案. 因代码篇幅较大,对代码进行了删减,文中 "..." 即为省略的一部分代码. 大致思路: 首先登录成功后,从后台拉取用户当前可显示的菜单和可用权限列表,分别将其存入 store 的 nav(菜单导航) 和 auth(用户可用权限) 中,在用户切换路由时,判断是否存在 auth ,如果不存在,则重新获取,判断当前访

  • 详解spring整合shiro权限管理与数据库设计

    之前的文章中我们完成了基础框架的搭建,现在基本上所有的后台系统都逃不过权限管理这一块,这算是一个刚需了.现在我们来集成shiro来达到颗粒化权限管理,也就是从连接菜单到页面功能按钮,都进行权限都验证,从前端按钮的显示隐藏,到后台具体功能方法的权限验证. 首先要先设计好我们的数据库,先来看一张比较粗糙的数据库设计图: 具体的数据库设计代码 /* Navicat MySQL Data Transfer Source Server : 本机 Source Server Version : 50537

  • Android权限管理之Permission权限机制及使用详解

    前言: 最近突然喜欢上一句诗:"宠辱不惊,看庭前花开花落:去留无意,望天空云卷云舒." 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活中少了点什么,所以想着围绕着最近面试过程中讨论比较多的一个知识点Android 6.0 权限适配问题来进行学习,不过我不想直接进入这个主题,所以选择先去了解一下Android的Permission权限机制及使用 Android权限机制: 权限是一种安全机制.Android权限主要用于限制应用程序内部某些具有限制性特性的功能使用以及应用程序之间的组

  • 基于vue实现网站前台的权限管理(前后端分离实践)

    Javascript做为当下的热门语言,用途很广泛,从前端到后端处处可见其存在,该技术如今在我们项目内部也大量使用来开发诸如CMS系统以及其他其他一些数据分析系统的前端页面,为此个人非常感兴趣并将其作为帽子卡的扩展内容来进行课余学习. Javascript框架鳞次栉比,但基本原理大致相同,因此选用国内人开发的vue.js进行一个初步的尝试.学习vue.js也一周多的时间了,说起vue的主要用法,无外乎Declarative Rendering.Component System.Client-si

  • 详解MySQL 用户权限管理

    前言: 不清楚各位同学对数据库用户权限管理是否了解,作为一名 DBA ,用户权限管理是绕不开的一项工作内容.特别是生产库,数据库用户权限更应该规范管理.本篇文章将会介绍下 MySQL 用户权限管理相关内容. 1.用户权限简介 当我们创建过数据库用户后,还不能执行任何操作,需要为该用户分配适当的访问权限. 关于 MySQL 用户权限简单的理解就是数据库只允许用户做你权利以内的事情,不可以越界.比如只允许你执行 select 操作,那么你就不能执行 update 操作.只允许你从某个 IP 上连接

随机推荐