StrongLoop:未阻止POST访问

时间:2016-01-22 19:57:12

标签: loopbackjs strongloop

我正在使用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

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

RESPONSE

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

发布错误,访问权限未被阻止。不工作。

CURL:

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

RESPONSE

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

1 个答案:

答案 0 :(得分:3)

在提出解决方案之前,我会尝试解释“创建”的原因是什么? (POST)方法不被拒绝。

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

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

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

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

  3. 现在,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(非常糟糕的解决方案,但有效