【问题标题】:Need Help Understanding ACL in Loopback需要帮助了解环回中的 ACL
【发布时间】:2015-10-14 01:55:00
【问题描述】:

我创建了一个名为“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 请求时,它就不起作用了。

另外,只是为了说明一下,我有 ShippingAddresses 模型与 Account 定义的关系(继承用户)。关系是: User -> hasMany ShippingAddress , ShippingAddress -> belongsTo Account.

我阅读了 Loopback Official docs 上的 ACL 文档,但我迷路了。一切似乎都设置正确,但仍然出现 401:需要授权。

【问题讨论】:

    标签: node.js loopbackjs strongloop


    【解决方案1】:

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

    另外请记住,在处理模型实例的所有权时,您必须将它们与“belongsTo”相关联。它要做的是将 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"
        }
      ]
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        Loopback 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 *

        如果设置了 DEBUG,我可以看到:

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

        所以7495是每个配置的分数,会选择最大的分数。

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

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

        【讨论】:

          猜你喜欢
          • 2017-06-19
          • 2016-05-03
          • 1970-01-01
          • 2021-01-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多