这里不对吧
来源:21-13 策略权限守卫:初步完成核心逻辑&准备测试数据

慕娘4151148
2025-07-01
这里的policies应该是用户所拥有的能力,这是通过username查出来的,并且也根据policies生成了用户的abilities,这里不应该用subjects或者right吗,这俩才是访问接口所需要的权限
写回答
2回答
-
Brian
2025-07-05
00 -
Brian
2025-07-05
// 1. 根据角色IDs批量查询:会返回一个数组,每个元素是 { id, RolePolicy: [...], … } const rolePolicy = await this.roleService.findAllByIds(roleIds); // 2. 过滤只和当前接口相关的 RolePolicy // - 外层 reduce 用于把所有角色的 RolePolicy 扁平合并到一个数组里 // - 内层 filter 根据 subject(资源类型)进行筛选 const rolePolicyFilterBySubjects = rolePolicy.reduce((acc, cur) => { const matched = cur.RolePolicy.filter((policy) => subjects.includes(policy.Policy.subject), ); acc.push(...matched); return acc; }, []); // 3. 从筛选后的 RolePolicy 中提取出真正的策略对象 IPolicy const policies: IPolicy[] = rolePolicyFilterBySubjects.map((o) => o.Policy); // 4. 把相关数据挂到 user 对象上,供后续权限判断使用: user.RolePolicy = rolePolicy; // 原始的角色策略(所有角色的 RolePolicy) delete user.password; // 安全考虑,删掉敏感字段 user.policies = policies; // 真正需要评估的数据权限策略 user.roleIds = roleIds; // 方便调试或后续使用 user.permissions = // 还把角色下的“接口级别”权限(RolePermissions)也收集一下 user.UserRole.reduce((acc, cur) => [...acc, ...cur.Role.RolePermissions], []); // 5. 调用 CASL 服务,构建 Ability 实例 // buildAbility 会把 policies 转化为 can/cannot 规则集合 const abilities = await this.caslAbilityService.buildAbility( policies, [user, req, this.reflector], ); // 6. 如果没有任何数据权限策略,则认为该接口不需要做数据级过滤 if (policies.length === 0) { return true; }
012025-07-05
相似问题