1

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


import { Ability } from '@casl/ability';

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

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

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
4

1 回答 1

4

从 4.0 开始,CASL 支持将类作为学科。因此,detectSubjectType在创建时会为每个规则调用Ability以检测主题的类型。

在您的情况下,该函数仅将传递的主题作为对象(带有subject字段)处理,但它也应该与字符串一起正常工作。

您在这里有 2 个选项:

  • 检查主题是否为字符串,如果是,则按原样返回
const ability = new Ability([{ action: 'read', subject: 'article' }], {
   detectSubjectType: subject => typeof subject === 'string' ? subject : subject.subject
})
  • 使用默认值detectSubjectType作为后备
import { Ability, detectSubjectType } from '@casl/ability';
const ability = new Ability([{ action: 'read', subject: 'article' }], {
   detectSubjectType: subject => subject && subject.subject ? subject.subject : detectSubjectType(subject)
})

Custom subject type detection部分,文档说:

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

  • subject什么时候undefined
  • 何时subject是 astring或 a function(这应该被视为主题类型)
  • 当主题是object

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

于 2020-05-02T09:21:08.413 回答