这里不对吧

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

慕娘4151148

2025-07-01

图片描述
这里的policies应该是用户所拥有的能力,这是通过username查出来的,并且也根据policies生成了用户的abilities,这里不应该用subjects或者right吗,这俩才是访问接口所需要的权限

写回答

2回答

Brian

2025-07-05

0
0

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;
}


0
1
慕娘4151148
我试过了,当不给用户设置任何policy时,逻辑上应该是不能通过的,但是代码运行是可以通过的,就是因为这里,这里的步骤6中的policies是用户的policy,应该用接口需要的policy
2025-07-05
共1条回复

NestJS 从拔高到精通,大型复杂业务架构落地实践

NestJS 从拔高到精通,大型复杂业务架构落地实践

153 学习 · 43 问题

查看课程