【问题标题】:StrongLoop: POST access not being blockedStrongLoop:POST 访问未被阻止
【发布时间】:2016-01-22 19:57:12
【问题描述】:

我正在使用 ACL 规则来阻止所有用户的所有类型的访问。它适用于 GET 访问,但不适用于 POST 访问。

知道可能出了什么问题吗?

这里是代码和示例结果:

/common/models/client.json

{
  "name": "client",
  "plural": "clients",
  "base": "User",
  "idInjection": true,
  "properties": {},
  "validations": [],
  "relations": {},
  "acls": [
    {
      "accessType": "*",
      "principalType": "ROLE",
      "principalId": "$everyone",
      "permission": "DENY"
    }
  ],
  "methods": {}
}

GET 访问错误(按预期工作,已被阻止):

卷曲

curl -X GET --header "Accept: application/json" "http://localserver:8080/api/quants"

回复

{
  "error": {
    "name": "Error",
    "status": 401,
    "message": "Authorization Required",
    "statusCode": 401,
    "code": "AUTHORIZATION_REQUIRED",
    "stack": "Error: Authorization Required\n    at ...
  }
}

POST 错误,访问未被阻止。不工作。

卷曲:

curl -X POST --header "Content-Type: application/json" --header "Accept: application/json" -d "{
  \"email\": \"test@email.com\",
  \"password\": \"abcd1234\"
}
" "http://localserver:8080/api/clients"

回复

{
  "email": "test@email.com",
  "id": "46b258078da5dtg1ji5809ww"
}

【问题讨论】:

    标签: loopbackjs strongloop


    【解决方案1】:

    在提出解决方案之前,我将尝试解释'create'(POST)方法不被拒绝的原因。

    您的 client 模型是 Loopback 的 User 内置模型的子模型。

    在这种情况下要记住两件重要的事情:

    1. 在子模型中定义的 ACL不会覆盖基类 ACLbut merged to them

    2. 当根据 ACL 检查请求时,Loopback 的算法会赋予 更接近 匹配更高的权重。在这种特定情况下,更接近的匹配是更具体的 ACL 定义。 (参考here

    现在,Loopback 的User 模型contains the following ACL

    {
      "principalType": "ROLE",
      "principalId": "$everyone",
      "permission": "ALLOW",
      "property": "create"
    }
    

    您定义的 ACL

    {
      "accessType": "*",
      "principalType": "ROLE",
      "principalId": "$everyone",
      "permission": "DENY"
      // no specific property
    }
    

    不太具体,因此算法不会选择。


    为了解决问题,您可以:

    1. 添加拒绝创建的特定ACL:

      {
        "principalType": "ROLE",
        "principalId": "$everyone",
        "permission": "DENY",
        "property": "create"
      }
      
    2. 删除允许从基础 User 模型创建的 ACL(非常糟糕的解决方案,但有效

    【讨论】:

    • 感谢@Reuven 的详细解释。我选择了解决方案 1),在我的客户端模型中添加特定的 ACL 规则,这是最好的解决方案。
    猜你喜欢
    • 2022-01-01
    • 2019-10-04
    • 2021-04-15
    • 2019-12-16
    • 1970-01-01
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多