首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用CASL定义使用JSON的能力

如何使用CASL定义使用JSON的能力
EN

Stack Overflow用户
提问于 2020-05-01 06:30:51
回答 1查看 2K关注 0票数 1

我一直在阅读CASL库的文档,显然您可以使用这样的JSON定义功能:

代码语言:javascript
复制
import { Ability } from '@casl/ability';

export default new Ability([
  {
    action: 'read',
    subject: 'Post'
  },
  {
    action: 'delete',
    subject: 'Post',
    conditions: { published: true },
    inverted: true
  }
])

但是现在,我正在尝试这样一个虚拟的例子,它不起作用,不知道为什么:

代码语言:javascript
复制
import { Ability } from '@casl/ability';
const ability = new Ability([{ action: 'read', subject: 'article' }], {
    detectSubjectType:subject => subject.subject
})
console.log(ability.can('read', {subject: 'article'})); // Returns false
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-02 09:21:08

从4.0开始,CASL支持将类作为主题。由于这个原因,在detectSubjectType创建时为每个规则调用Ability,以便检测主题的类型。

在您的示例中,函数只处理作为对象传递的主题(使用subject字段),但它也应该与字符串一起正常工作。

你在这里有两个选择:

  • 检查subject是否为字符串,如果为字符串,则按
代码语言:javascript
复制
const ability = new Ability([{ action: 'read', subject: 'article' }], {
   detectSubjectType: subject => typeof subject === 'string' ? subject : subject.subject
})
  • 使用默认的detectSubjectType作为后盾
代码语言:javascript
复制
import { Ability, detectSubjectType } from '@casl/ability';
const ability = new Ability([{ action: 'read', subject: 'article' }], {
   detectSubjectType: subject => subject && subject.subject ? subject.subject : detectSubjectType(subject)
})

自定义主题类型检测一节中,医生们说:

自定义检测函数必须返回string并处理下一种情况:

  • subjectundefined
  • subjectstringfunction时(这应该被视为主题类型)
  • 当主体是object

如果您不想处理所有这些情况,您可以回退到内置的detectSubjectType函数,它将为您完成此任务。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61537893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档