CASL JS报错:无法对Article执行delete操作,请求协助排查
CASL JS 删除Article时出现"Cannot execute 'delete' on 'Article'"错误的解决方法
问题原因
CASL 权限系统遵循默认拒绝原则:所有未被明确允许的操作都会被拒绝。你的规则仅通过inverted: true定义了「禁止删除已发布的Article」,但未添加「允许删除未发布Article」的规则,因此即便目标文章是未发布状态,也会因无匹配的允许规则而被拒绝。
解决方案
提供两种可行的修改方案:
方案1:直接明确允许规则(推荐)
直接添加允许删除published: false的Article的规则,其余情况默认拒绝,实现需求的同时更简洁:
const rules = [ { action: "read", subject: "Article" }, { action: "delete", subject: "Article", conditions: { published: false } } ];
方案2:保留禁止提示的规则配置
如果需要保留「禁止删除已发布文章」的明确错误提示,可以先允许所有Article的删除操作,再通过inverted规则限制已发布的情况(CASL规则按顺序匹配,先匹配到的规则生效):
const rules = [ { action: "read", subject: "Article" }, { action: "delete", subject: "Article" }, { inverted: true, action: "delete", subject: "Article", conditions: { published: true }, reason: "You are not allowed to delete this article" } ];
验证
修改规则后:
- 对于
published: false的anotherArticle,ForbiddenError.from(ability).throwUnlessCan("delete", anotherArticle)不会抛出错误; - 若创建
published: true的Article实例,会触发预设的禁止错误提示。
内容的提问来源于stack exchange,提问作者Bablu Ahmed
相关产品推荐
相关产品推荐

