Vue项目权限管理思想梳理

281 阅读7分钟

本文已参与[新人创作礼]活动,一起开启掘金创作之路

权限:在系统中是否具备做某个操作的权利

一.权限分为两个级别:

1.页面级:是否有权限访问某个菜单(例如:根据权限显示相应权限的菜单)

2.按钮级:是否有权力操作页面上的某个按钮功能(例如:同一网页根据不同权限导入按钮)

二.权限点管理-静态结构搭建-并批量准备api

1.此时需在表格外部准备一个添加权限按钮,表格内部各行数据准备3个权限操作

image.png

2.表格渲染数据,若数据不是树形结构需将其转为树形结构,并使表单支持树形结构

3.业务逻辑

对于权限数据来说,他只有两个级别的设置:

第一层:能不能访问页面

第二层:在页面上,能不能操作某个按钮

4.表单补充业务点--type=1才能显示添加按钮

注1.当type为1时为路由页面访问权限,type为2时为按钮功能操作权限

注2.只有页面级别的节点,才能有添加功能即给该按钮设置了权限控制

5.弹出框设置,并渲染数据及添加表单校验

image.png

注1:表单外与表单内的添加按钮均可触发弹出框,同时传递相应的参数

注2:点击表单外添加按钮,添加的是一级路由的访问权限也就是菜单的权限,参数为('', 1)

注3:点击表单内添加按钮,添加的是路由对应页面里面按钮的操作权限,参数为(当前需要添加项的id, 2)

6. 弹出框功能实现

(1)确定按钮校验表单,发请求,关闭弹框,提示,重新发请求获取表格数据

(2)取消按钮,关闭弹框,提示

(3)关闭弹框触发close事件,重置表单及清空校验

7.删除权限点及编辑权限点

(1) 删除权限功能实现(弹出框,确定发请求发提示信息关弹出框,取消关弹出框)

(2) 编辑权限点和添加共用一个弹出框

 补充数据项isEdit来区别是否处于编辑状态
     
     添加时isEdit为false,编辑时为true
 
 点击编辑之后,获取详情,显示在表单中,保存用户修改后的结果
 
     保存成功,关闭弹层,重新发请求获取表格数据,提示
 
     添加和编辑公用一个确定事件,将公用的代码放在此方法中,
     使用isEdit判断添加或编辑来触发各自不同的代码      
 弹出框标题title自定义

三.RBAC权限设计思想

1. 背景

为了达成不同的帐号登陆系统后能看到不同的页面,能执行不同的功能的目标,我们有很多种解决方案,RBAC(Role-Based Access control)权限模型 ,也就是基于角色的权限分配解决方案。

其权限模式如下:

image.png

2. 三个主体

(1) 用户: 使用系统的人(员工)

权限点:这个系统中有多少个功能(例始:有3个页面,每个页面上各自有3,2,4个不同的操作)

(2) 角色:不同的权限点的集合

image.png

(3) 如何给用户添加功能

给用户分配角色,给角色分配权限点

(4) 系统中的权限点可以随意添加吗

不能。必须是程序员已经开发出来的功能

3. 员工分配角色-弹层组件

背景

目前系统中已经有一些角色,我们下面要将这些角色分配给不同的员工,让他们进入系统后,做不同的事情。

用户和角色是1对多的关系:一个用户可以拥有多个角色,这样他就会具体这多个角色的权限了。比如公司的董事长可以拥有财务主管和保安队长的角色: 董事长可以看财务报表,也可以查看监控。

四. 角色管理组件

image.png

1. 思路

(1) 把具体的功能给拆分出去(角色的功能比较复杂,拆分组件会减轻工作量)

(2) 通过弹层控制显示

2. 角色管理主页渲染,注册弹出框组件

3. 点击分配角色按钮,记录id,显示弹层

4. 交互效果-关闭弹层

(1) 用户点击了取消按钮

(2) 用户点击了确定按钮,且操作成功

(3) 用户点击了弹层的右上角的X

5. 获取角色列表并用el-checkbox显示

(1) 发请求获取本系统中所有的角色列表并显示在el-checkbox-group

(2) 对于用来表示多选的el-checkbox-group来说:

v-model的值是数组(表示多选)

它的子元素el-checkboxlabel属性决定了选中这一项之后值

(3) 获取用户id,用id去获取当前的角色信息,显示选中角色数据

6. 出现数据无法再次渲染问题解决方案

(1) 每次使用后销毁弹出框组件(v-if)

(2) 在父组件中使用子组件方法(ref)

7.调用接口,将用户修改后的角色保存下来

五. 角色分配权限

1. 为什么要给角色分配权限

用户是什么角色(职位),他就具备某些功能

前面的代码中已经给用户加了角色了,那员工到底能做什么事,还是由角色中携带的具体的功能来定的。

2. 获取数据并渲染角色管理模块

3. 封装弹出框子组件,注册事件用于子组件显示隐藏

4. 获取权限点数据并显示

(1) 准备权限点接口

(2) 弹框展示之后:

1.  调用api发请求获取数据;
2.  对数据进行格式转换(数组转树)
3.  模板绑定(把数据显示到el-tree上)

5. 设置el-tree的属性

显示选择框,默认全部展开,关闭父子关联

注:一级页面查看权限,二级按钮操作权限

6. 当前用户可能有一些已有的权限,需要我们回显出来

tree补充属性node-key把数据填充到el-tree中,让某些个复选框处于选中状态

7.出现弹出框数据无法重新获取参考上一次添加编辑时处理方案

8.保存

这里的参数有两个:

在点击分配权限时,可以从表格中获取当前的角色id, 父传子;对应的权限列表id:通过el-tree组件的getCheckedKeys来获取用户选中的id列表

el-tree 获取当前选中的节点的keys: getCheckedKeys (设置:setCheckedKeys)

六. 总结

到目前为止,我们实现了RBAC权限设计思想的各个环节,我们给员工分配了角色,给角色又分配了权限点,员工现在已经有了相对应的权限点,接下来我们就可以利用这些权限点做实际的权限控制,在项目里,权限的控制有两个地方:

1. 左侧菜单权限控制(不同的用户进来系统之后,看到的菜单是不同的)

2. 操作按钮权限控制 (页面上的按钮,不同的人也有不同权限)

七. 权限应用--动态生成左侧菜单

分析

登录成功(页面跳转),进入导航守卫:

(1) 获取个人权限信息(使用员工账号登录,查看个人信息接口)

(2) 生成可以访问的动态路由(请套娃至下方链接12步)(⊙o⊙)还有这种操作,学费了

juejin.cn/post/708163…