前端界面权限控制-React/Vue实现
前言
在所有管理系统中,都会包含权限模块,来进行用户的权限分配和控制,从而达到操作和数据隔离。
权限管理主要以后台权限控制为主,加上前台界面显示来进行不同级别的权限控制管理。
通常在前端的权限控制设计中,按照不同细粒度进行划分为三类:
- 页面级别
- 模块级别
- 按钮级别
在应用React/Vue的前端框架界面中,这三类基本都是通过组件来进行权限控制,所以本文主要针对组件的扩展来实现。
实现
以前端界面的用户模块权限控制为例,通过不同权限来显示可操作的组件,达到操作控制效果。
前端要加入权限控制的话,要确保新模块对原系统的侵入性很小,尽量在不改动原系统框架的基础上进行扩展。
首先在用户登录后,后台会返回相应的权限集合,然后进行界面控制。
权限组集合:
// 权限集合
let auths = [
{id: 100, auth: 'admin_user', name: '用户模块'},
{id: 101, auth: 'admin_user_get', name: '查看用户'},
{id: 102, auth: 'admin_user_add', name: '添加用户'},
{id: 103, auth: 'admin_user_del', name: '删除用户'},
{id: 104, auth: 'admin_user_edit', name: '编辑用户'},
]
接下来将从react和vue两个框架分别实现权限控制
React实现
在react框架中,采用的是React高阶组件来实现权限控制。在不改动原有组件的情况下,对现有组件进行权限属性扩展。
通过高阶组件包装现有组件,进行权限组件验权,如果组件无需权限控制或权限匹配,则默认不做处理,直接显示原组件。如果组件权限校验失败,则显示空内容。[注意:使用高阶组件包装,如果原组件用到静态方法和ref属性,需要特殊处理,请参考React高阶组件说明]
验权实现:
// 组件验权
function checkAuth(auth) {
// 用户权限表
const rules = auths;
for (let i = 0; i < rules.length; i++) {
const item = rules[i]
// 无需权限控制或者权限匹配则通过
if(!auth || (auth == item.auth)){
return true
}
}
return false
}
// 高阶组件包装原组件
function warpAuth(WrappedComponent) {
let New = class extends React.Component {
constructor(props) {
super(props)
}
render () {
if (checkAuth(this.props.auth)) {
return
} else {
return null
}
}
}
// !如果原组件有静态方法,则需要进行拷贝处理
// https://github.com/mridgway/hoist-non-react-statics
// hoistNonReactStatic(New, WrappedComponent);
return New
}
实例应用:
let Button = wrapAuth(Button)
class Page extends React.Component {
constructor(props) {
super(props)
}
render () {
return (
)
}
}
Vue实现
在vue框架中,采用的是Vue自定义指令来实现权限控制。在不改动原有组件的情况下,对现有组件统一进行权限指令扩展。
通过自定义权限指令,进行权限组件验权,如果组件无需权限控制或权限匹配,则默认不做处理,直接显示原组件。如果组件权限校验失败,则移除该组件。[注意:添加自定义指令,全部组件包括第三方组件库都会生效]
验权实现:
// 需要在入口处添加自定义权限指令v-auth,显示可操作组件
Vue.directive('auth', {
bind: function (el, binding, vnode) {
// 用户权限表
const rules = auths
for (let i = 0; i < rules.length; i++) {
const item = rules[i]
if(!binding.value || (binding.value == item.auth)){
// 权限允许则显示组件
return true
}
}
// 移除组件
el.parentNode.removeChild(el)
}
})
实例应用:
总结
可能有人会说,如果只通过简单检测是否有权限,那万一有人进行非法权限注入,前端界面就会显示本该无权限的操作组件。针对这个问题的疑虑,我想说任何前端的权限控制、加密、设防等技术都存在缺陷,因为暴漏在外的程序被破解的风险很高,还是那句话,后台对前台发出的请求都不应该直接信任,任何包含权限的操作都需要在后台进行拦截和过滤,识别用户的权限再进行处理。
好了,关于前端的权限控制就写到这,有任何疑问和错误随时留言,感谢支持