未经授权的用户可以在环回中访问相关模型

时间:2018-05-24 06:42:39

标签: node.js access-token loopback

我已经从MyModel模型添加了模型User和扩展客户端模型。我已经设置了MyModelClient之间的关系。客户端可以拥有多个MyModel,而每个MyModel都属于一个客户端。

在Client.json中

... 
"relations": {
    "myModels": {
      "type": "hasMany",
      "model": "MyModel",
      "foreignKey": "createdBy"
    }
  }
...

在MyModel.json

...
"relations": {
    "client": {
      "type": "belongsTo",
      "model": "Client",
      "foreignKey": "createdBy"
    }
  },
...

设置关系后,我得到一个端点,如/ clients /:id / myModels等。即使未对用户进行身份验证,也会加载与客户端相关的MyModel

现在我已按照以下方式设置ACL, 在MyModel.json中,

...
"acls": [
    {
      "accessType": "*",
      "principalType": "ROLE",
      "principalId": "$unauthenticated",
      "permission": "DENY"
    }
  ],
...

在尝试获取与客户端相关的MyModel列表时,不会应用身份验证检查。即使用户未经过身份验证,也会检索MyModel列表。

我认为我需要添加ACL来限制未经身份验证的用户访问相关模型。所以我尝试在Client.json

中添加以下ACL
    ...
    "acls": [
        {
          "accessType": "*",
          "principalType": "ROLE",
          "principalId": "$unauthenticated",
          "permission": "DENY",
          "property":"__get__myModels"
        }
      ]
    ...

但它并没有改变任何事情。

但是,如果经过身份验证的用户尝试路由/client/:id/mymodels/count,则会显示Unauthorized User错误。

解决这个问题需要做些什么?

1 个答案:

答案 0 :(得分:0)

如果您使用Role和RoleMapping的动态方式,可以尝试这样做。 职责:

 { 
    "name" : "admin", 
    "description" : "admin role", 
    "created" : "2018-02-23T15:48:40.514+0000", 
    "modified" : ISODate("2018-02-23T15:48:40.514+0000")
   }

RoleMapping:

{ 
    "principalId" : ObjectId("5b06825775abbd45b3f02719"), 
    "roleId" : ObjectId("5a903836876b6f0bbaa64c40"), 
    "principalType" : "USER", 
    "created_by" : "user", 
    "created_at" : ISODate("2018-05-24T09:13:59.352+0000")
}

和ACL:

{
    "model" : "YourModel",
    "property": 'find', 
    "accessType": '*',
    "principalType": 'ROLE',
    "principalId": 'admin', // depends on role name
    "permission": 'ALLOW'
}

以及其他属性以及findOne,deleteById等。

对于所有未经认证的人:

您也可以尝试这样

{ 
    "model" : "YourModel", 
    "property" : "find", 
    "accessType" : "*", 
    "permission" : "DENY", 
    "principalType" : "ROLE", 
    "principalId" : "$everyone"
}

对于特定用户

{ 
    "model" : "YourModel", 
    "property" : "find", 
    "accessType" : "*", 
    "permission" : "ALLOW", 
    "principalType" : "ROLE", 
    "principalId" : "5a817425e09bdb38f9217c20", // user doc id
}