如何使用 CASL 定义 JSON 的能力
How can I define abilities with a JSON using CASL
我一直在阅读 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.0开始,CASL支持类作为主题。因此,在 Ability
创建时为每个规则调用 detectSubjectType
以检测主题的类型。
在您的情况下,该函数仅将传递的主题作为对象处理(使用 subject
字段),但它也应该与字符串一起正常工作。
这里有 2 个选项:
- 检查主题是否是一个字符串,如果是 return 它是
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 部分,文档说:
自定义检测函数必须 return string
并处理以下情况:
- 当
subject
是 undefined
- 当
subject
是 string
或 function
时(这应该被视为主题类型)
- 当主题是
object
如果您不想处理所有这些情况,您可以回退到内置的 detectSubjectType
函数,它会为您做这件事。
我一直在阅读 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.0开始,CASL支持类作为主题。因此,在 Ability
创建时为每个规则调用 detectSubjectType
以检测主题的类型。
在您的情况下,该函数仅将传递的主题作为对象处理(使用 subject
字段),但它也应该与字符串一起正常工作。
这里有 2 个选项:
- 检查主题是否是一个字符串,如果是 return 它是
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 部分,文档说:
自定义检测函数必须 return string
并处理以下情况:
- 当
subject
是undefined
- 当
subject
是string
或function
时(这应该被视为主题类型) - 当主题是
object
如果您不想处理所有这些情况,您可以回退到内置的 detectSubjectType
函数,它会为您做这件事。