如何在CASL的JSON规则集中校验用户属性而非主体属性?
CASL JSON规则校验用户角色的正确写法
要校验用户自身的角色属性,CASL的JSON规则里可以直接通过user关键字访问用户的属性,无需依赖博客文章(subject)的字段。以下是具体实现:
基础场景:允许指定角色(如admin)更新所有博客
如果要让admin角色的用户拥有所有博客的更新权限,规则可以这么写:
{ "actions": "update", "subject": "BlogPost", "conditions": { "user.roles": { "$in": ["admin"] } } }
这里用CASL支持的MongoDB风格查询操作符$in,判断用户的roles数组是否包含"admin"。
组合场景:要么是文章作者,要么是admin角色
如果要保留之前的作者校验逻辑,同时允许admin角色更新任意文章,可以用$or组合两个条件:
{ "actions": "update", "subject": "BlogPost", "conditions": { "$or": [ { "authorId": "{{userId}}" }, { "user.roles": { "$in": ["admin"] } } ] } }
这个规则表示:用户要么是文章的作者(authorId和用户userId匹配),要么拥有admin角色,都能获得更新权限。
注意事项
- 要确保CASL配置中已将当前请求的用户对象传入权限检查上下文,这样规则里的
user才能正确指向用户数据。 - 之前用Mustache替换
{{userId}}的逻辑可以保留,用于作者校验的部分。
内容的提问来源于stack exchange,提问作者Rob
相关产品推荐
相关产品推荐

