1、前言

  上篇,我们讲了后端的授权。与后端不同,前端主要是通过功能入口如菜单、按钮的显隐来控制授权的。具体来讲,就是根据指定用户的制定权限来加载对应侧边栏菜单和页面内的功能按钮。我们一个个来讲。

2、侧边栏菜单

  鉴于本项目使用了vue-router,那显然,侧边栏就会跟对应路由关联,同时,前端项目会注册路由导航事件,此事件见src根目录下permission.js:

  截图中,上边的红框代表是在注册路由跳转前回调钩子,此钩子可以根据具体情况决定是否需要导航到目的路由或导航到其他路由。下边的红框先调用menu store中的获取侧边栏action,从后端拿到本用户具有权限的侧边栏菜单:

  从后端拿到侧边栏菜单json,前端是没办法直接使用的,一堆json对象或者字符串,与Vue路由、视图并没法儿无缝衔接,所以上边我们看到调用了travseRoutes方法,此方法在前端工具类route.js中,如下:

  主要用意就是经由后端动态菜单配置前端vue-router动态路由,用到了vue-router中路由懒加载这个重要的特性。以上就是前端动态侧边栏的实现。

3、功能按钮

  大部分项目都做到了菜单级的权限控制,但做到页面级别的,倒是不多。毕竟他该多,而且也是要费点儿功夫的。那这里我们就来看看前端是如何实现按钮级权限控制的。

  一般而言,组件显隐可以通过v-show或v-if,但若通过这种方式,恐怕得在viewmodel中定义大量属性,最好的情况,也得在需要控制的地方顶一个计算属性吧,这种方式恐怕代价还是有一些的。针对这点,web-flash前端项目中,很巧妙地用到了自定义Vue指令这个特性,将按钮的加载与去除逻辑封装了起来,具体在前端项目src/directive/permission.js中:

import store from '@/store'

export default{
inserted(el, binding, vnode) {
const { value } = binding
const permissions = store.getters && store.getters.permissions
if (value && value instanceof Array && value.length > 0) {
const permissionRoles = value
const hasPermission = permissions.some(permission => {
return permissionRoles.includes(permission)
}) if (!hasPermission) {
el.parentNode && el.parentNode.removeChild(el)
}
} else {
throw new Error(`need roles! Like v-permission="['admin','editor']"`)
}
}
}

  自定义指令有几种类型钩子函数,这里选取了inserted,代表是在元素插入后判断有无指定按钮权限,如果没有,则从界面再移除。接下来,我们就实际看看效果。首先,在用户管理对应的视图js中引入自定义指令:

  然后,我们在用户视图文件中对新增、编辑、删除用户几个按钮用自定义指令做权限控制:

 <el-col :span="24">
<el-button type="success" size="mini" icon="el-icon-plus" @click.native="add" v-permission="['/mgr/add']">
{{$t('button.add') }}
</el-button>
<el-button type="primary" size="mini" icon="el-icon-edit" @click.native="edit" v-permission="['/mgr/edit']">
{{$t('button.edit') }}
</el-button>
<el-button type="danger" size="mini" icon="el-icon-delete" @click.native="remove" v-permission="['/mgr/delete']">
{{$t('button.delete') }}
</el-button>
<el-button type="info" size="mini" icon="el-icon-role" @click.native="openRole">角色分配</el-button>
</el-col>
</el-row>

  之后,我们用一个不具有用增删改权限的用户登录系统:

  可以看到,添加、修改、删除用户菜单是不可见的。那现在我把添加按钮的v-permission指令拿掉,则再看效果:

  可见,拿掉v-perission,添加用户按钮显示出来了,反面说明前端授权生效了。

Core + Vue 后台管理基础框架4——前端授权的更多相关文章

  1. Core + Vue 后台管理基础框架3——后端授权

    1.前言 但凡业务系统,授权是绕不开的一环.见过太多只在前端做菜单及按钮显隐控制,但后端裸奔的,觉着前端看不到,系统就安全,掩耳盗铃也好,自欺欺人也罢,这里不做评论.在.NET CORE中,也见过不少 ...

  2. Core + Vue 后台管理基础框架0——开篇

    1.背景 最近,打算新开个项目,鉴于团队技术栈,选型.net core + vue,前后端分离.本打算捡现成的轮子的,github上大致逛了逛,总发现这样那样的不太适合心中那些“完美实践”,例如:Ab ...

  3. Core + Vue 后台管理基础框架2——认证

    1.前言 这块儿当时在IdentityServer4和JWT之间犹豫了一下,后来考虑到现状,出于3个原因,暂时放弃了IdentityServer4选择了JWT: (1)目前这个前端框架更适配JWT: ...

  4. Core + Vue 后台管理基础框架1——运行系统

    1.down源码 git clone https://github.com/KINGGUOKUN/SystemManagement.git,项目目录如下: 2.还原数据库 找到项目根目录下System ...

  5. Core + Vue 后台管理基础框架8——Swagger文档

    1.前言 作为前后端分离的项目,或者说但凡涉及到对外服务的后端,一个自描述,跟代码实时同步的文档是极其重要的.说到这儿,想起了几年前在XX速运,每天写完代码,还要给APP团队更新文档的惨痛经历.给人家 ...

  6. Core + Vue 后台管理基础框架9——统一日志

    1.背景 前阵子有园友留言,提到日志相关的东西,同时,最近圈子里也有提到日志这个东西.一个充分.集中的统一日志平台还是很有必要的,否则系统出问题了只能靠猜或者干瞪眼.何谓充分,日志记录满足最低要求.出 ...

  7. Core + Vue 后台管理基础框架7——APM

    1.前言 APM,又称应用性能统计,主要用来跟踪请求调用链,每个环节调用耗时,为我们诊断系统性能.定位系统问题提供了极大便利.本系统采用的是Elastic Stack体系中的APM,主要是之前部门搞P ...

  8. hsweb 企业后台管理基础框架

    hsweb 详细介绍 业务功能 现在: 权限管理: 权限资源-角色-用户. 配置管理: kv结构,自定义配置.可通过此功能配置数据字典. 脚本管理: 动态脚本,支持javascript,groovy, ...

  9. 基于bootstrap的漂亮网站后台管理界面框架汇总

    基于bootstrap的漂亮网站后台管理界面框架汇总 10个最新的 Bootstrap 3 管理模板 这里分享的 10 个模板是从最新的 Bootstrap 3 管理模板集合中挑选出来的,可以帮助你用 ...

随机推荐

  1. Linux基础快捷键

  2. ISBN|方正|超星|The national academies press|OECD|RSC|Springer Link|Knovel|Encyclopedia Britannica

    图书使用图书分类号ISBN作为图书的ID 大英百科全书(Encyclopedia Britannica)可用于找寻关键词或关键词相关信息,便于构建准确的检索式: Knovel:可使用物理化学性质查找相 ...

  3. springboot学习笔记:1.前言

    眼下,随着微服务敏捷开发的势头日益增长,前几年刚刚萌芽的话题,到了现在已经炽手可热.在java圈子里,springboot作为spring生态圈的顶级项目,更是火的不得了.作为java程序员,不了解和 ...

  4. win10安装motionbuilder失败,怎么强力卸载删除注册表并重新安装

    一些搞设计的朋友在win10系统下安装motionbuilder失败或提示已安装,也有时候想重新安装motionbuilder的时候会出现本电脑windows系统已安装motionbuilder,你要 ...

  5. Java IO: 管道

    原文链接 作者: Jakob Jenkov  译者: 李璟(jlee381344197@gmail.com) Java IO中的管道为运行在同一个JVM中的两个线程提供了通信的能力.所以管道也可以作为 ...

  6. RxSwift学习笔记之Subject

    本文为原创文章,转载请标明出处 AsyncSubject 一个AsyncSubject只在原始Observable完成后,发射来自原始Observable的最后一个值.它会把这最后一个值发射给任何后续 ...

  7. 机器学习入门-逻辑(Logistic)回归(1)

    原文地址:http://www.bugingcode.com/machine_learning/ex3.html 关于机器学习的教程确实是太多了,处于这种变革的时代,出去不说点机器学习的东西,都觉得自 ...

  8. ArrayList与LinkList对比

    本文简要总结一下java中ArrayList与LinkedList的区别,这在面试中也是常常会问到的一个知识点. 先来看一下ArrayList和LinkedList的关系是怎样的: 从继承体系可以看到 ...

  9. 从ArrayList的优化中想到的

    在JDK7中ArrayList有一个小的改动,使用延迟加载的思想,默认构造函数不再初始化生成一个大小为10的数组,而是将elementData先赋值为一个共享的空数组. package java.ut ...

  10. k8s集群搭建(三)

    Dashboard安装 Kubernetes Dashboard是k8s提供基于Web的监控和操作界面,可以通过UI来显示集群的所有工作负载,除了查看资源,还是创建.编辑.更新.删除资源. 根据Kub ...