Elasticsearch中能否按条件关联文件夹并进行权限继承校验?
文件夹权限继承校验方案
核心逻辑
当文件夹的inherit_permission字段为true时,通过inherit_folder_id关联到指定的父文件夹,校验该父文件夹的权限是否适用于当前文件夹。
实现步骤
- 构建快速查找映射:将文件夹数组转换为以
id为键的对象,避免重复遍历数组查找目标文件夹 - 遍历校验每个文件夹:对每个文件夹判断是否开启权限继承,若开启则定位到目标父文件夹
- 执行权限校验:根据业务规则,验证父文件夹的权限是否可应用于当前文件夹(比如用户权限匹配、权限类型兼容等)
代码示例(JavaScript)
// 示例文件夹数据 const folders = [ { id: 1, name: "Root folder", parent_id: 0, inherit_folder_id: null, inherit_permission: false, permissions: [{ role: "admin", user: "user1" }, { role: "editor", user: "user2" }] }, { id: 2, name: "Accounts", parent_id: 1, inherit_folder_id: 1, inherit_permission: true, permissions: [] }, { id: 3, name: "Finance", parent_id: 2, inherit_folder_id: 1, inherit_permission: true, permissions: [] } ]; // 构建文件夹ID映射表,用于快速查找 const folderIdMap = folders.reduce((acc, folder) => { acc[folder.id] = folder; return acc; }, {}); // 权限继承校验函数 function validateFolderPermissionInheritance(folder, currentUser) { // 未开启权限继承,直接返回自身权限 if (!folder.inherit_permission) { return { folderName: folder.name, useInheritedPermissions: false, permissions: folder.permissions }; } // 获取继承目标文件夹 const targetFolder = folderIdMap[folder.inherit_folder_id]; if (!targetFolder) { return { folderName: folder.name, error: "指定的继承文件夹不存在" }; } // 校验当前用户是否拥有目标文件夹的权限(示例逻辑,可根据业务调整) const userHasPermission = targetFolder.permissions.some(perm => perm.user === currentUser); return { folderName: folder.name, useInheritedPermissions: true, inheritedFrom: targetFolder.name, userHasAccess: userHasPermission, inheritedPermissions: targetFolder.permissions }; } // 执行校验(示例用户:user2) const currentUser = "user2"; folders.forEach(folder => { console.log(validateFolderPermissionInheritance(folder, currentUser)); });
关键说明
- 映射表优化:
folderIdMap将数组查找的时间复杂度从O(n)降为O(1),适合处理大量文件夹数据的场景 - 校验逻辑可定制:示例中的权限校验仅为基础场景,实际业务中可扩展为权限合并、权限优先级判断、多级继承递归校验等逻辑
内容的提问来源于stack exchange,提问作者Stanislau Karaliou
相关产品推荐
相关产品推荐

