在环回 [Strongloop] 中对模型内的属性应用访问限制

Apply Access restriction to properties inside a model in loopback [Strongloop]

我有一个名为 employee 的模型,它的属性是

"name":"",
"dob":"",
"location":""

环回框架中的一些默认角色是

$authenticated
$everyone

我想

1.Allow $authenticated 访问模型的角色 employee[READ and WRITE].

2.Allow $everyone 作用仅对 [READ] 除了 location 属性 的模型属性] [位置仅允许 ROLE $authenticated] 读取。 ,

我在 employee.json 中添加了以下配置,但是没有用。

{
      "accessType": "READ",
      "principalType": "ROLE",
      "principalId": "$everyone",
      "permission": "ALLOW"
    },
    {
      "accessType": "READ",
      "principalType": "ROLE",
      "principalId": "$everyone",
      "permission": "DENY",
      "property": "location"
    }

搜索了很多,找不到代码。

我认为您可以在 employee.json:

中针对问题 1) 做些什么
...
"acls": [
    {
      "accessType": "*",
      "principalType": "ROLE",
      "principalId": "$everyone",
      "permission": "DENY"
    },
    {
      "accessType": "READ",
      "principalType": "ROLE",
      "principalId": "$authenticated",
      "permission": "ALLOW"
    },
    {
      "accessType": "WRITE",
      "principalType": "ROLE",
      "principalId": "$authenticated",
      "permission": "ALLOW"
    }
  ]
…

关于问题 2) - 我认为这实际上在 LoopbackJS 中是不可能的(不确定)。

property 属性用于访问您将在 employee.js 文件中定义的自定义方法(remoteMethods 名称)——不适用于模型的属性。

下面的代码将在我的场景下工作,但它并不完美,它是一种解决方法,我猜有一些称为 mixins 的方法可以完成这些任务。由于我的问题没有得到回答,我正在提供解决方案。

Employee.afterRemote('**', function(ctx, result, next) {
        if(ctx.result) {
            if(Array.isArray(ctx.result)) {
              ctx.result.forEach(function (result) {
                var  is_logged_in = ctx.req.accessToken;
                if(is_logged_in == null){
                    console.log('1');
                    result.unsetAttribute('location')
                }
              });
            } else {
              ctx.result.unsetAttribute('location')
            }
          }

          next();
    });