1

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

...
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 优先考虑没有字段限制的条件会更好吗?

4

1 回答 1

1

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

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

在 casl v5 中,该参数是必需的。所以,这种混乱很快就会消失

于 2020-12-17T08:43:02.900 回答