156 lines
3.6 KiB
TypeScript
156 lines
3.6 KiB
TypeScript
import { useUserStore } from "@/store";
|
|
import { ROLE_ROOT, PERM_ALL } from "@/constants";
|
|
|
|
/**
|
|
* 检查是否拥有指定权限
|
|
*
|
|
* @param permission 权限标识,支持字符串或字符串数组(满足其一即可)
|
|
* @returns 是否拥有权限
|
|
*
|
|
* @example
|
|
* hasPermission('sys:user:create') // 检查单个权限
|
|
* hasPermission(['sys:user:create', 'sys:user:update']) // 满足其一即可
|
|
*/
|
|
export function hasPermission(permission: string | string[]): boolean {
|
|
// 参数校验
|
|
if (!permission) {
|
|
console.warn("[Permission] 需要提供权限标识");
|
|
return false;
|
|
}
|
|
|
|
// 标准化为数组
|
|
const permissions = Array.isArray(permission) ? permission : [permission];
|
|
|
|
// 空数组校验
|
|
if (permissions.length === 0) {
|
|
console.warn("[Permission] 权限标识数组不能为空");
|
|
return false;
|
|
}
|
|
|
|
const userStore = useUserStore();
|
|
const userInfo = userStore.userInfo;
|
|
|
|
// 未登录或无用户信息
|
|
if (!userInfo) {
|
|
return false;
|
|
}
|
|
|
|
const { roles = [], perms = [] } = userInfo;
|
|
|
|
// 超级管理员拥有所有权限
|
|
if (roles.includes(ROLE_ROOT)) {
|
|
return true;
|
|
}
|
|
|
|
// 检查是否包含全部权限标识
|
|
if (permissions.includes(PERM_ALL)) {
|
|
return true;
|
|
}
|
|
|
|
// 检查权限:满足其一即可
|
|
return permissions.some((perm) => perms.includes(perm));
|
|
}
|
|
|
|
/**
|
|
* 检查是否拥有指定角色
|
|
*
|
|
* @param role 角色标识,支持字符串或字符串数组(满足其一即可)
|
|
* @returns 是否拥有角色
|
|
*
|
|
* @example
|
|
* hasRole('ADMIN') // 检查单个角色
|
|
* hasRole(['ADMIN', 'TEST']) // 满足其一即可
|
|
*/
|
|
export function hasRole(role: string | string[]): boolean {
|
|
// 参数校验
|
|
if (!role) {
|
|
console.warn("[Permission] 需要提供角色标识");
|
|
return false;
|
|
}
|
|
|
|
// 标准化为数组
|
|
const roles = Array.isArray(role) ? role : [role];
|
|
|
|
// 空数组校验
|
|
if (roles.length === 0) {
|
|
console.warn("[Permission] 角色标识数组不能为空");
|
|
return false;
|
|
}
|
|
|
|
const userStore = useUserStore();
|
|
const userInfo = userStore.userInfo;
|
|
|
|
// 未登录或无用户信息
|
|
if (!userInfo) {
|
|
return false;
|
|
}
|
|
|
|
const userRoles = userInfo.roles || [];
|
|
|
|
// 超级管理员拥有所有角色
|
|
if (userRoles.includes(ROLE_ROOT)) {
|
|
return true;
|
|
}
|
|
|
|
// 检查角色:满足其一即可
|
|
return roles.some((r) => userRoles.includes(r));
|
|
}
|
|
|
|
/**
|
|
* 检查是否拥有所有指定权限(且关系)
|
|
*
|
|
* @param permissions 权限标识数组
|
|
* @returns 是否拥有所有权限
|
|
*/
|
|
export function hasAllPermissions(permissions: string[]): boolean {
|
|
if (!permissions || permissions.length === 0) {
|
|
return false;
|
|
}
|
|
|
|
const userStore = useUserStore();
|
|
const userInfo = userStore.userInfo;
|
|
|
|
if (!userInfo) {
|
|
return false;
|
|
}
|
|
|
|
const { roles = [], perms = [] } = userInfo;
|
|
|
|
// 超级管理员拥有所有权限
|
|
if (roles.includes(ROLE_ROOT)) {
|
|
return true;
|
|
}
|
|
|
|
// 检查权限:必须全部满足
|
|
return permissions.every((perm) => perms.includes(perm));
|
|
}
|
|
|
|
/**
|
|
* 检查是否拥有所有指定角色(且关系)
|
|
*
|
|
* @param roles 角色标识数组
|
|
* @returns 是否拥有所有角色
|
|
*/
|
|
export function hasAllRoles(roles: string[]): boolean {
|
|
if (!roles || roles.length === 0) {
|
|
return false;
|
|
}
|
|
|
|
const userStore = useUserStore();
|
|
const userInfo = userStore.userInfo;
|
|
|
|
if (!userInfo) {
|
|
return false;
|
|
}
|
|
|
|
const userRoles = userInfo.roles || [];
|
|
|
|
// 超级管理员拥有所有角色
|
|
if (userRoles.includes(ROLE_ROOT)) {
|
|
return true;
|
|
}
|
|
|
|
// 检查角色:必须全部满足
|
|
return roles.every((role) => userRoles.includes(role));
|
|
}
|