CASL无匹配规则的主体默认返回false,如何修改为默认返回true?
CASL未配置规则的主体默认返回true的实现方法
完全可以修改默认行为,你的需求可以通过添加兜底全局允许规则实现,这也是CASL官方推荐的白名单反向控制方案:
实现逻辑
CASL默认规则匹配优先级为从上到下匹配,未匹配到任何规则时返回false。你只需要在所有权限规则的末尾添加一条覆盖所有主体、所有操作的允许规则,即可实现「仅有限制规则的主体走校验逻辑,无配置的主体默认全权限」的效果。
代码示例
import { Ability } from '@casl/ability'; const ability = new Ability([ // 先写所有需要限制的主体的权限规则 { action: "read", subject: "FirstSubject" }, // 如需拒绝某个主体的特定权限,添加inverted为true的规则即可 { action: "write", subject: "FirstSubject", inverted: true }, // 末尾加兜底规则,所有未匹配到规则的主体默认全部允许 { action: "manage", subject: "all" } ]); // 测试结果完全符合预期 ability.can("read", "FirstSubject"); // 结果为true ability.can("write", "FirstSubject"); // 结果为false ability.can("read", "SecondSubject"); // 结果为true ability.can("write", "SecondSubject"); // 结果为true
注意事项
- 所有需要限制的权限规则必须放在兜底规则之前,否则会被兜底规则覆盖
manage是CASL内置的通配操作,代表所有操作;all是内置的通配主体,代表所有主体- 如果后续需要新增限制某个主体的权限,只需在兜底规则前添加对应规则即可,无需修改其他配置
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

