【发布时间】:2020-11-17 17:21:12
【问题描述】:
目前,我正在构建一个具有以下类似逻辑的应用程序:
...
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 用户条件。但这需要稍后在将新字段添加到项目时间模型中时进行大量迁移工作。 (在我的情况下,也无法将第二个条件包含在 else 块中)
还有其他更好的方法吗?或者,如果permittedFieldsOf-function 会优先考虑没有字段限制的条件会更好吗?
【问题讨论】:
标签: casl