前端的权限控制
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了前端的权限控制相关的知识,希望对你有一定的参考价值。
参考技术A 1.菜单的控制在登陆请求中,回到的权限数据,这个权限的数据是后端返回的数据,前端根据权限数据,展示对应的菜单,点击菜单,才能看到相关的界面。
2.界面的控制
如果用户没有登录,手动在地址栏中输入管理界面的地址,则页面会跳转到登录界面,
如果用户已经登录,但是手动输入非权限内的地址,则会跳转到404界面中去。
3.按钮的控制
在某个菜单的界面中,还需要根据权限数据,展示出该权限范围内可以操作的按钮,比如增删改查
4请求和相应的控制
如果用户通过非常规的操作,比如通过浏览器的调试工具将某些禁用的按钮变成了启用的状态,这个时候发的请求,也应该由前端所拦截。
vue项目路由权限控制实现(前端控制)
存在一个角色权限数组,在给定的路由数组里面,找出有权限的项组成新路由,meta.roles里面的任意一个角色存在于角色列表里面,就有权限,如果父路由没有权限,子路由不应该权限
场景:
存在路由如:
route = [
{
path: \'/home\',
meta: {
roles: [2, 9]
},
children: [
{
meta: {
roles: [2]
}
},
{
meta: {
roles: [9]
}
}
]
},
{
meta: {
roles: [90, 4]
},
children: [
{
meta: {
roles: [4]
}
},
{
meta: {
roles: [90]
}
}
]
},
{
path: \'/home\',
meta: {
roles: [100, 1]
},
children: [
{
meta: {
roles: [2]
}
}
]
}
]
当前用户拥有的角色列表,如:rolesList = [2,9,90]
要根据角色列表输出最终有权限的路由,上述场景输出:
result = [
{
path: \'/home\',
meta: {
roles: [2, 9]
},
children: [
{
meta: {
roles: [2]
}
},
{
meta: {
roles: [9]
}
}
]
},
{
path: \'/home\',
meta: {
roles: [90, 4]
},
children: [
{
meta: {
roles: [90]
}
}
]
}
]
实现方法1:
// 当前路由是否有权限
function existJurisdiction(router) {
if (!router.meta) return false
let { roles } = router.meta
return rolesList.some(item => roles.includes(item))
}
// 找出有权限的一级路由
function getResult (route) {
let _result = route.filter(item => {
let _existJurisdiction = existJurisdiction(item)
// 当前路由有权限,则找出子路由中存在权限的路由赋值给子路由
_existJurisdiction && (item.children = (item.children && getResult(item.children)))
return _existJurisdiction
})
return _result
}
let result = getResult(route)
实现2:(思路和实现1一样,existJurisdiction函数的判断逻辑改为当前roles和角色权限列表是否有交集,有则表示有权限)
function existJurisdiction(router) {
if (!router.meta) return false
let { roles } = router.meta
// return (roles.length + rolesList.length) !== Array.from(new Set([...roles, ...rolesList])).length
return (roles.length + rolesList.length) !== (new Set([...roles, ...rolesList])).size
}
以上是关于前端的权限控制的主要内容,如果未能解决你的问题,请参考以下文章