如果未设置所有者,则回送ACL

时间:2016-06-24 09:02:40

标签: node.js loopbackjs

我有一个应用程序,您可以在不经过身份验证的情况下开始下订单,只需在付款的最后一步之前注册。这意味着我的模型订单首先是在没有任何所有者的情况下创建和更新的,以便保存数据,然后在流程结束时附加userId。

如何创建允许以下内容的ACL:

如果没有所有者,每个人都要执行 如果有所有者,只有所有者可以执行其中的所有内容。 目前,有些订单的userId为null,而其他一些订单已设置,如果我想列出我的订单,例如已经过身份验证的用户,我有401。

提前多多感谢

1 个答案:

答案 0 :(得分:0)

我通过创建一个名为softOwner的新自定义角色来成功完成。如果有人需要它,这里是代码:

module.exports = function(app) {
  var Role = app.models.Role;
  Role.registerResolver('softOwner', function(role, context, cb) {
    function reject(err) {
      if(err) {
        return cb(err);
      }
      cb(null, false);
    }

    var userId = context.accessToken.userId;
    if (!userId) {
      return reject(); // do not allow anonymous users
    }
    context.model.findById(context.modelId, function(err, model) {
      if(err || !model) {
        reject(err);
      }

      if(model.userId) {
        // if there is an owner, check that it is the right owner

        (model.userId == context.accessToken.userId) ? cb(null, true) : reject();
      } else {
        // if there is no owner, authorize
        cb(null, true);
      }
    });
  });
};

然后将其添加到ACL中:

{
  "accessType": "*",
  "principalType": "ROLE",
  "principalId": "$everyone",
  "permission": "DENY"
},
{
  "accessType": "WRITE",
  "principalType": "ROLE",
  "principalId": "softOwner",
  "permission": "ALLOW"
},