一直对权限设计很感兴趣,以前写后端代码时,搞过权限设计,挺有意思的,但是前端按钮级别的权限设计了解过,却还没具体实现过,最近项目打算对权限进行细分,先研究下前端的权限吧。

权限设计的出发点在于,让不同权限的用户,看到的内容、可实现的操作是不同的。

到具体设计上来说,可以分为路由级权限和按钮级权限,从实现的难以层度上来说,都挺简单的,这篇博客主要讲按钮级别的权限控制。

按钮级权限需要做的是什么?

做权限控制,首先要知道要实现的目的是什么。

按钮级权限控制比较简单,根据身份不同,可以看到的按钮、可操作的功能也不相同。

首先要进行身份的区分和校验,可根据服务端下发的用户权限类别,提取出公共方法。

// ../utils/auth.js 文件位置//获取当前客户权限
export function getCurrentAuthority(){...return ["admin"]
}//校验权限
export function check(authority = []){let current = getCurrentAuthority();return current.some(item=>item.includes(item))
}//登录校验
export function isLogin(){const current = getCurrentAuthority();return current && current[0] !== "guest";
}

两种实现方法

抽离出公共方法进行身份提取和校验后,在不同的组件中就可以使用了,最粗暴的方法,就是直接使用 v-if 来进行疯狂的判断。

但是这种方法不优雅,而且会对原有就使用 v-if 的内容造成困扰,因此可以将权限判断进行使用上的封装,主要有两种方法,一是组件,二是指令。

1. 组件方式

既然 v-if 不太优雅,那么是否可以将 v-if 的功能封装呢,答案当然是可行的,我们只需要在需要权限控制的内容外部再嵌套上一层组件,通过外层组件来判断内层组件是否渲染,就可以实现我们所需要的 v-if 的能力。

关于这个权限组件,我们可以进行思考下。

首先,权限组件并不需要有具体的 dom 渲染,它的作用只是根据条件来判断是否来渲染它嵌套的具体业务组件。这样的话,它可以不具备 template 模板内容,只需要具体逻辑即可,这样它可以只是纯粹的函数式组件,通过引用封装好的权限校验方法,来判断props中所允许的权限。

组件实现:

<script>
import { check } from "../utils/auth.js";export default {name: 'Authorized',functional:true,props: {authority:{type:Array,required:true}},  render(h, context) {const { props, scopedSlots } = context;return check(props.authority) ? scopedSlots.default() : null},
}
</script>

思路:

通过 props 传递允许的权限,在 render 函数中,通过上下文取出 props 和 slot 插槽内容,通过 check 方法校验 props 传递的权限是否通过,根据结果渲染 slot 的内容,实现权限控制。

组件使用:

<template><Authorized :authority="['admin']" ><other-components></other-components></Authorized>
</template>

注:Authorized 组件会在多个地方使用,可以进行全局注册,具体代码不展示

2.指令方式

使用组件方式进行权限控制,基本已经可以很好的满足我们实现按钮级权限控制的需求了,只需要在需要控制权限的按钮外面添加组件。

不过每次都需要在外面嵌套组件,还是比较繁琐的,我们可以参考下 v-if 进行自定义指令控制。

//./directives/auth.js
import { check } from '../utils/auth.js';function install(Vue, options = {}) {Vue.directive(options.name || 'auth', {inserted(el, binding) {if (!check(binding.value)) {el.parentNode && el.parentNode.removeChild(el);}}})
}export default { install }

思路:

接收自定义指令 binding 中传递的参数,通过 check 函数进行校验,校验未通过时,获取当前指令所在节点的父节点,来删除掉当前节点,实现权限控制。

指令注册:

// main.js
import auth from './directives/auth.js'Vue.use(auth)

指令使用:

<template><other-components v-auth="['admin']"></other-components>
</template>

优缺点

使用组件方式来实现权限控制,在权限修改后会比较灵活的渲染受控部分,同时使用时候会稍微繁琐;

指令方式实现的权限控制,使用起来会比较简洁,但是是通过删减 dom 节点的方式实现的,因此只有在第一次时控制。

权限在赋予后,不会随意变动,可以根据使用场景来选用两种不同的方式。

相关资料

1. Vue 函数式组件

2. 自定义指令

前端权限设计实现——按钮级相关推荐

  1. WEB前端网页设计-Bootstrap 按钮下拉菜单

    目录 Bootstrap 按钮下拉菜单 分割的按钮下拉菜单 按钮下拉菜单的大小 按钮上拉菜单 Bootstrap 按钮下拉菜单 本章将讲解如何使用 Bootstrap class 向按钮添加下拉菜单. ...

  2. vue实现页面权限显示_Vue 实现前端权限控制

    登录&&权限流程图 前言 首先我们确定的权限控制分为三大部分,其中根据粒度大小分的更细: 登录权限控制 页面权限控制 菜单中的页面是否可以被访问 页面中的按钮 (增.删.改.查)的权限 ...

  3. 数据级的权限管理和功能级的权限管理的区别,不使用框架(shiro,springsecurity)做权限设计的思考

    1 数据级的权限管理和功能级的权限管理 引自:http://www.iteye.com/problems/97374 功能级权限,有大有小.大的可以直接包括一个业务模块,小的可以是一个按钮.一般的功能 ...

  4. WinForm/MIS项目开发之中按钮级权限实践

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  5. 08-HR-权限管理模块(给员工分配角色,权限点管理页面开发,给角色分配权限,前端权限-页面访问权(路由),前端权限-按钮操作权)

    权限管理模块 RBAC的权限设计思想 采用方案: RBAC的权限模型,RBAC(Role-Based Access control) ,也就是基于角色的权限分配解决方案 权限控制目标:不同的用户登录系 ...

  6. Vue自定义指令实现按钮级权限

    在很多后台管理系统中,常常需要做按钮权限控制. 当然我们可以使用v-if来实现,不过这样做,每个页面都要获取一次权限信息,代码往往很冗余. 接下来我们将封装自定义指令,来实现按钮级的权限控制. 一.先 ...

  7. 权限设计的一些想法和思考

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:cross my.oschina.net/cloudcros ...

  8. tp5权限管理代码_权限系统控制到按钮级别开源推荐 Spring BootShiroVue

    往期精彩推荐: 高逼格开源聊天系统 推荐 Spring+Netty+Websocket实现 java人关注这个github开源项目,你会嫌弃手上的笔试面试题资料 2020年一线大厂java笔试面试题分 ...

  9. 由浅入深,聊聊权限设计

    作者:cross___ 链接: https://my.oschina.net/cloudcross/blog/1920706 转载请在文中注明来源和作者 权限设计的杂谈 这篇文章的定位,不是宣传某个框 ...

最新文章

  1. AndroidToast问题深度剖析(一)
  2. perl随机打乱数组
  3. SQL 注入详解扫盲
  4. s3c2440芯片累加汇编语言,s3c2440 --跑马灯 C+汇编代码
  5. DotnetSpider (一) 架构的理解、应用、搭建
  6. 无法显示 xml 页 解决方案
  7. 四格漫画《MUXing》——度姐传说
  8. 基于.NET Framework 4.0的解决方案部署
  9. 使用identity+jwt保护你的webapi(一)——identity基础配置
  10. python导入同一文件夹下的类_python自定义模块
  11. 初级使用Latex写论文经验总结
  12. kubernetes发布tomcat服务,通过deployment,service布署
  13. matlab fft函数画幅度谱,如何在FFT幅度谱上绘制掩模线
  14. JUC笔记-同步器(AQS原理、ReentrantLock原理)
  15. js正则 保留一位小数或者两位小数
  16. java 打砖块算法_打砖块java代码详细
  17. 如何选择第三方电子发票平台服务商?
  18. ajax angular点击事件_angularjs和ajax的结合使用 (三)
  19. 8月1号起 银行卡、支付宝、微信的这些费用可以省了!
  20. Linux下用户账号管理基础

热门文章

  1. IntelliJ IDEA - 闪退解决方案
  2. python循环结构高一信息技术_高中信息技术《程序的循环结构(1)》优质课教学设计、教案...
  3. Matlab GUI编程技巧(一):如何使gui编的界面一运行就居中
  4. 21点游戏双人对战(javaweb形式)
  5. DICOM文件的matlab读取
  6. 三星手机电池循环清零代码_巅峰对决申真谞离奇“滑标” 三星杯决赛首局柯洁轻松告捷...
  7. vs2003一查找就卡死了
  8. root精灵华为解锁,华为刷机精灵解锁
  9. 谷歌浏览器的默认字号是多大?以及如何设置比最小字体还小的字体?
  10. java进销存培训_Java学员作品-企业进销存管理