用户模型的环回ACL

时间:2017-02-10 10:27:29

标签: node.js acl loopbackjs strongloop

我使用loopback为SPA网站创建一个简单的API。我想让我的权限尽可能简单,所以我最终得到了以下ACL模型

  • 默认情况下拒绝所有权限
  • 每个人都允许使用多个模型中的某些方法
  • 任何授权用户都允许使用所有方法
如果我要创建多个用户并且没有人能够再创建或修改用户,这显然会有效。由于我无法明确更改内置User模型的权限,因此我创建了admin模型,该模型扩展了User。然后我将public模型的User属性设置为false。我设置了以下ACL规则

{
  "accessType": "*",
  "principalType": "ROLE",
  "principalId": "$everyone",
  "permission": "DENY"
},
{
  "accessType": "EXECUTE",
  "principalType": "ROLE",
  "principalId": "$everyone",
  "permission": "ALLOW",
  "property": "login"
},
{
  "accessType": "*",
  "principalType": "ROLE",
  "principalId": "$authenticated",
  "permission": "ALLOW"
}

在我看来,它应该拒绝任何非正式用户访问login以外的任何方法。

不幸的是,这不是它的工作原理,任何人仍然可以POST / users并创建新用户。我的猜测是ACL规则不适用于继承的模型,因此User的规则适用于此处。所以我回到原点,我无法直接更改User权限或覆盖它们。

我有什么选择?有没有办法阻止创建新用户?

2 个答案:

答案 0 :(得分:3)

事实证明,规则细节比继承级别更重要。在这种情况下,User模型专门为create属性定义规则。此规则优先于更一般的拒绝每个属性,即使在扩展的admin模型中定义了拒绝规则。因此,我必须从User模型中获取所有允许的规则,并在admin中明确拒绝这些规则。

答案 1 :(得分:0)

几天前我遇到了同样的问题,我找到了解决方案。回送默认 POST /用户规则是每个人都可以插入用户。因此,您的管理模型是从用户模型继承的,因此规则也被继承。我们将不得不在您的管理模型中覆盖创建权限。 Loopback User model Default permission for POST

只需将 common / models / admin.json

中的acl对象放在下面
...
 acl : [{
  "principalType": "ROLE",
  "principalId": "$everyone",
  "permission": "DENY",
  "property": "create"
},{
  "principalType": "ROLE",
  "principalId": "$authenticated",
  "permission": "ALLOW",
  "property": "create"
}]
...

因此,您将通过覆盖默认规则来首先拒绝访问每个人,并将规则设置为只能发布的 $ authenticated 。 您可以根据需要设置规则。