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. 密码子演化假说|凝固事件假说|立体化学假说|共进化假说|代谢途径相关性假说|四重兼并|假四重兼并|最小损伤原则|AU-rich|GC-rich|逐步进化假说|分子机制进化假说

    生命组学 将密码子表重排后发现,嘌呤嘧啶含量不同,密码子的氨基酸种类由第一二位决定,同时第三位变化大却没有蛋白质层面上实质性的改变,这说明第三位氨基酸是用于维持氨基酸组成不发生变化同时保证蛋白质稳定性 ...

  2. Eclipse 配置Android 开发环境

    1.eclipse安装ADT插件. 地址:http://dl-ssl.google.com/android/eclipse/ 2.安装成功后,提示重启.重新启动后弹出android sdk 的路径选择 ...

  3. 2015-09-14-初级string

    标准库string类型 string对象初始化 string s1; string s2(s1); string s3("value"); string s4(n,'c'); st ...

  4. 吴裕雄--天生自然 R语言开发学习:时间序列(续二)

    #-----------------------------------------# # R in Action (2nd ed): Chapter 15 # # Time series # # r ...

  5. 正则提取关键字符-python代码实现

    原文地址:http://www.bugingcode.com/blog/python_re_extraction_key.html 关于python的正则使用在以前的文章中 http://www.bu ...

  6. shell知多少?

    Shell字面理解就是个"壳",是操作系统(内核)与用户之间的桥梁,充当命令解释器的作用,将用户输入的命令翻译给系统执行.Linux中的shell与Windows下的DOS一样,提 ...

  7. process.env

    官方: process.env属性返回一个包含用户环境信息的对象.

  8. 监控Linux系统所选的服务所占进程内存占用

    [代码] #!/bin/bash #程序功能描述: # 监控系统所选的服务所占进程内存占用 #作者:孤舟点点 #版本:1.0 #创建时间:-- :: PATH=/bin:/sbin:/usr/bin: ...

  9. 玩转UITableView

    UITableView这个iOS开发中永远绕不开的UIView,那么就不可避免的要在多个页面多种场景下反复摩擦UITableView,就算是刚跳进火坑不久的iOS Developer也知道实现UITa ...

  10. Ta说:2016微软亚洲研究院第二届博士生论坛

    ​ "聚合多元人才创造无尽可能,让每一位优秀博士生得到发声成长机会"可以说是这次微软亚洲研究院博士生论坛最好的归纳了.自去年首次举办以来,这项旨在助力青年研究者成长的项目迅速得到了 ...