所谓的权限控制是什么?
一般后台管理系统的权限涉及到两种:
- 资源权限
- 数据权限
资源权限一般指菜单、页面、按钮等的可见权限。
数据权限一般指对于不同用户,同一页面上看到的数据不同。
本文主要是来探讨一下资源权限,也就是前端权限控制。这又分为了两部分:
- 侧边栏菜单
- 路由权限
在很多人的理解中,前端权限控制就是左侧菜单的可见与否,其实这是不对的。举一个例子,假设用户guest
没有路由/setting
的访问权限,但是他知道/setting
的完整路径,直接通过输入路径的方式访问,此时仍然是可以访问的。这显然是不合理的。这部分其实就属于路由层面的权限控制。
实现思路
关于前端权限控制一般有两种方案:
- 前端固定路由表和权限配置,由后端提供用户权限标识
- 后端提供权限和路由信息结构接口,动态生成权限和菜单
我们这里采用的是第一种方案,服务只下发当前用户拥有的角色就可以了,路由表和权限的处理统一在前端处理。
整体实现思路也比较简单:现有权限(currentAuthority
)和准入权限(authority
)做比较,如果匹配则渲染和准入权限匹配的组件,否则渲染无权限组件
(403 页面)
路由权限
既然是路由相关的权限控制,我们免不了先看一下当前的路由表:
{"name": "活动列表","path": "/activity-mgmt/list","key": "/activity-mgmt/list","exact": true,"authority": ["admin"],"component": ƒ LoadableComponent(props),"inherited": false,"hideInBreadcrumb": false
},
{"name": "优惠券管理","path": "/coupon-mgmt/coupon-rule-bplist","key": "/coupon-mgmt/coupon-rule-bplist","exact": true,"authority": ["admin","coupon"],"component": ƒ LoadableComponent(props),"inherited": true,"hideInBreadcrumb": false
},
{"name": "营销录入系统","path": "/marketRule-manage","key": "/marketRule-manage","exact": true,"component": ƒ LoadableComponent(props),"inherited": true,"hideInBreadcrumb": false
}
这份路由表其实是我从控制台 copy 过来的,内部做了很多的转换处理,但最终生成的就是上面这个对象。
这里每一级菜单都加了一个authority
字段来标识允许访问的角色。component
代表路由对应的组件:
import React, { createElement } from "react"
import Loadable from "react-loadable"
"/activity-mgmt/list": {component: dynamicWrapper(app, ["activityMgmt"], () => import("../routes/