需要帮助了解环回中的ACL

时间:2015-10-14 01:55:01

标签: node.js loopbackjs strongloop

我创建了一个名为“ShippingAddresses”的模型,它具有以下ACL规则。

[
    {
      "accessType": "*",
      "principalType": "ROLE",
      "principalId": "$everyone",
      "permission": "DENY"
    },
    {
      "accessType": "READ",
      "principalType": "ROLE",
      "principalId": "$owner",
      "permission": "ALLOW"
    },
    {
      "accessType": "EXECUTE",
      "principalType": "ROLE",
      "principalId": "$authenticated",
      "permission": "ALLOW",
      "property": "create"
    },
    {
      "accessType": "WRITE",
      "principalType": "ROLE",
      "principalId": "$owner",
      "permission": "ALLOW"
    }
  ]

当我通过在端点/ api / shipping_addresses上进行POST调用来创建记录时,它可以正常工作,但是当我在同一端点/ api / shipping_addresses上发出GET请求时,它无效。

另外,只是为了旁注,我使用Account(继承用户)定义了ShippingAddresses模型的关系。关系是:用户 - > hasMany ShippingAddress,ShippingAddress - > belongsTo Account。

我阅读了关于Loopback官方文档的ACL文档,但我迷路了。一切似乎设置正确但仍然获得401:需要授权。

3 个答案:

答案 0 :(得分:2)

问题在于 READ 权限,因为您只将其设置为 $ owner 。它的含义是:只有模型实例的所有者才能查看该实例。因此,只有当您为与所有者(User)相关的实例传递id时,它才会起作用,即与findById()相同。

另外请注意,在使用所有权来建立模型实例时,您必须将它们与“属于”相关联。它将要做的是将userId添加到模型实例,以便环回知道该模型实例属于谁。此外,它还会创建新的休息端点。例如:

User.modelname.create()  //this way modelname instance is created for User.
                         //User is the owner of current modelname instance.

否则,如果您想允许所有人访问 GET 其他终结点,请使用以下 ACL

[
    {
      "accessType": "*",
      "principalType": "ROLE",
      "principalId": "$everyone",
      "permission": "DENY"
    },
    {
      "accessType": "READ",
      "principalType": "ROLE",
      "principalId": "$everyone",
      "permission": "ALLOW"
    },
    {
      "accessType": "EXECUTE",
      "principalType": "ROLE",
      "principalId": "$authenticated",
      "permission": "ALLOW",
      "property": "create"
    },
    {
      "accessType": "WRITE",
      "principalType": "ROLE",
      "principalId": "$owner",
      "permission": "ALLOW"
    }
  ]

答案 1 :(得分:0)

ACL是loopback框架的一个特性。 与其他框架相比,它对nodejs开发很有用。 看到你的问题将为模型正确创建将改变角色。 首先,您参考身份验证和回送的authrotation

将为models / script.js添加编码 https://github.com/strongloop/loopback-example-access-control/blob/master/common/models/project.js

答案 2 :(得分:0)

环回ACL破坏了我的半天时间。

我的问题是另一个问题(关于错误的角色映射数据),但我认为使它起作用的过程是相同的。

我的解决方案:

  1. 仔细阅读Loopback ACL precedence->无法找出任何错误
  2. 打开DEBUG=loopback:security:*->(在控制台中)Lb告诉我它无法获取角色映射
  3. 检查mongo表。我的角色映射是string,而不是mongo的ObjectID
  4. 解决

@achintverma问题:

{
  "accessType": "*",
  "principalType": "ROLE",
  "principalId": "$everyone",
  "permission": "DENY"
},
{
  "accessType": "READ",
  "principalType": "ROLE",
  "principalId": "$owner",
  "permission": "ALLOW"
},

以上conf表示$owner ALLOW READ优先于$everyone DENY *

如果设置了调试,我会看到类似的东西:

loopback:security:acl with score: 7495 +0ms

因此7495是每种配置的分数,将选择最大的分数。

  

但是当我在同一端点/ api / shipping_addresses上发出GET请求时   它不起作用。

肯定是因为当前用户不是$owner