StrongLoop:POST 访问未被阻止

StrongLoop: POST access not being blocked

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

回应

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

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

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"

回应

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

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

您的 client 模型是 Loopback 的 User 内置模型的 sub-model。

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

  1. sub-model 中定义的 ACL 不会覆盖基础 class ACL 的but 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(非常糟糕的解决方案,但有效