我一直在阅读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发布于 2020-05-02 09:21:08
从4.0开始,CASL支持将类作为主题。由于这个原因,在detectSubjectType创建时为每个规则调用Ability,以便检测主题的类型。
在您的示例中,函数只处理作为对象传递的主题(使用subject字段),但它也应该与字符串一起正常工作。
你在这里有两个选择:
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)
})在自定义主题类型检测一节中,医生们说:
自定义检测函数必须返回string并处理下一种情况:
subject是undefined时subject是string或function时(这应该被视为主题类型)object时如果您不想处理所有这些情况,您可以回退到内置的detectSubjectType函数,它将为您完成此任务。
https://stackoverflow.com/questions/61537893
复制相似问题