获得正确的允许条件字段

  • 本文关键字:条件 字段 许条件 casl
  • 更新时间 :
  • 英文 :


目前,我正在构建一个具有以下类似逻辑的应用程序:

...
const user = {
isAdmin: true,
company: '5faa6a847b42bf47b8f785a1',
projects: ['5faa6a847b42bf47b8f785a2']
}
function defineAbilityForUser(user) {
return defineAbility((can) => {
if (user.isAdmin) {
can('create', 'ProjectTime', {
company: user.company,
}
);
}

can(
'create', 
'ProjectTime', 
["company", "project", "user", "start", "end"], 
{
company: user.company,
project: {
$in: user.projects
}
}
);
});
}
const userAbility = defineAbilityForUser(user); //
console.log( permittedFieldsOf(userAbility, 'create', 'ProjectTime') );
// console output: ['company', 'project', 'user', 'start', 'end']

基本上,admin应该被允许在没有字段限制的情况下创建项目时间。none admin用户应该只被允许为他所属的项目设置指定的字段。

问题是,我希望得到[]作为输出,因为应该允许admin设置项目时间的所有字段。

我找到的唯一解决方案是在admin用户条件上设置所有字段。但这需要以后在项目时间模型中添加新字段时进行大量迁移工作。(在我的情况下,也不可能将第二个条件包装在其他块中(

还有其他更好的方法吗?或者,如果permittedFieldsOf-函数在没有字段限制的情况下对条件进行优先级排序,会更好吗?

casl实际上无法知道模型上下文中所有字段的含义。它对它们的形状几乎一无所知,并依赖于您提供的条件来稍后检查这些对象。因此,它没有完整的信息。

您需要做的是传递第4个参数来覆盖fieldsFrom回调。检查@casl/mongoose 中的api文档和参考实现

在casl v5中,该参数是必需的。因此,这种混乱将很快消失

相关内容

  • 没有找到相关文章

最新更新