59 lines
1.6 KiB
TypeScript
59 lines
1.6 KiB
TypeScript
// 权限常量列表
|
|
// 每个权限标识一个功能点,用于前后端一致的权限控制
|
|
|
|
export const Permissions = {
|
|
USER_MANAGE: '用户管理',
|
|
|
|
// SUPER_ADMIN_ONLY: '超级管理员' // 该权限不能被授权,因此注释掉,但在项目中统一用"SUPER_ADMIN_ONLY"表示超级管理员权限
|
|
} as const;
|
|
|
|
export type Permission = typeof Permissions[keyof typeof Permissions];
|
|
|
|
export const ALL_PERMISSIONS: Permission[] = Object.values(Permissions);
|
|
|
|
// 判断用户权限列表是否满足表达式,如 "A&B|(C&D)"
|
|
export function evaluatePermissionExpression(
|
|
expr: string,
|
|
userPermissions: string[]
|
|
): boolean {
|
|
if (!expr || expr.trim() === '') { // expr为空、null或者undefined都返回true
|
|
return true;
|
|
}
|
|
// 分词
|
|
const tokens: string[] = []
|
|
const regex = /(\&|\||\(|\))/
|
|
expr.split(regex).map(s => s.trim()).filter(s => s).forEach(tok => tokens.push(tok))
|
|
let pos = 0
|
|
function parseExpr(): boolean {
|
|
let value = parseTerm()
|
|
while (tokens[pos] === '|') {
|
|
pos++
|
|
value = value || parseTerm()
|
|
}
|
|
return value
|
|
}
|
|
function parseTerm(): boolean {
|
|
let value = parseFactor()
|
|
while (tokens[pos] === '&') {
|
|
pos++
|
|
value = value && parseFactor()
|
|
}
|
|
return value
|
|
}
|
|
function parseFactor(): boolean {
|
|
const tok = tokens[pos++]
|
|
if (tok === '(') {
|
|
const value = parseExpr()
|
|
if (tokens[pos] === ')') pos++
|
|
return value
|
|
}
|
|
// 普通权限名
|
|
return userPermissions.includes(tok)
|
|
}
|
|
try {
|
|
return parseExpr()
|
|
} catch {
|
|
return false
|
|
}
|
|
}
|