perf: 优化权限判断,支持或的关系

This commit is contained in:
ibuler
2022-03-04 14:11:49 +08:00
committed by huailei
parent 8d0f71f681
commit 5eb9a58f61
3 changed files with 23 additions and 31 deletions

View File

@@ -126,7 +126,8 @@ export default [
component: empty,
redirect: '',
meta: {
permissions: []
permissions: ['rbac.view_orgrole | rbac.view_systemrole'],
app: 'rbac'
},
children: [
{
@@ -135,9 +136,8 @@ export default [
name: 'RoleList',
meta: {
title: i18n.t('route.RoleList'),
permissions: [],
app: 'rbac',
resource: 'role'
permissions: ['rbac.view_orgrole | rbac.view_systemrole']
}
},
{

View File

@@ -5,7 +5,7 @@ import {
} from '@/router'
import empty from '@/layout/empty'
import Layout from '@/layout/index'
import { getResourceNameByPath, getBeforeViewRoute } from '@/utils/jms'
import { getResourceNameByPath, getBeforeViewRoute, hasPermission } from '@/utils/jms'
function hasLicense(route, rootState) {
const licenseIsValid = rootState.settings.hasValidLicense
@@ -39,20 +39,6 @@ export function filterHiddenRoutes(routes, rootState) {
return res
}
function hasPermission(perms, route) {
// console.log('>>> Route: ', route)
const permsRequired = route.meta?.permissions
// Vue.$log.debug('Route permissions required: ', route.path, permsRequired)
let has
if (!permsRequired || permsRequired.length === 0) {
has = true
} else {
has = perms.some(perm => permsRequired.includes(perm))
}
// Vue.$log.debug('Has permission: ', route.path, ' => ', has)
return has
}
const actionMapper = {
create: 'add',
update: 'change',
@@ -150,9 +136,8 @@ function cleanRoute(tmp, parent) {
return tmp
}
export function filterPermedRoutes(routes, rootState, permsCache, parent) {
export function filterPermedRoutes(routes, parent) {
const res = []
const perms = permsCache || rootState.users.perms
for (const route of routes) {
let tmp = {
@@ -160,9 +145,9 @@ export function filterPermedRoutes(routes, rootState, permsCache, parent) {
}
tmp = cleanRoute(tmp, parent)
if (hasPermission(perms, tmp)) {
if (hasPermission(tmp.meta.permissions)) {
if (tmp.children) {
tmp.children = filterPermedRoutes(tmp.children, rootState, perms, tmp)
tmp.children = filterPermedRoutes(tmp.children, tmp)
}
res.push(tmp)
}
@@ -213,7 +198,7 @@ const actions = {
},
generateRoutes({ commit, dispatch, rootState }, { to, from }) {
return new Promise(resolve => {
let routes = filterPermedRoutes(allRoutes, rootState)
let routes = filterPermedRoutes(allRoutes, null)
routes = filterHiddenRoutes(routes, rootState)
if (routes.length === 0) {
console.log('No route find')

View File

@@ -4,21 +4,28 @@ export function openTaskPage(taskId) {
window.open(`/#/ops/celery/task/${taskId}/log/`, '', 'width=900,height=600')
}
export function hasPermission(permsRequired) {
const perms = store.getters?.currentOrgPerms || []
export function checkPermission(permsRequired, permsAll) {
if (!permsRequired || permsRequired.length === 0) {
return true
}
if (typeof permsRequired === 'string') {
permsRequired = [permsRequired]
}
const has = perms.some(perm => {
return permsRequired.includes(perm)
return permsRequired.every(perm => {
// 包含 | 是或的关系, 单独处理
if (perm.indexOf('|') === -1) {
return permsAll.includes(perm)
}
const permOr = perm.split('|').map(item => item.trim())
return permOr.some(perm => {
return permsAll.includes(perm)
})
})
return has
}
export function hasPermission(permsRequired) {
const permsAll = store.getters?.currentOrgPerms || []
return checkPermission(permsRequired, permsAll)
}
export function getResourceNameByPath(path) {