环回:在远程方法中验证用户

时间:2017-01-17 03:03:04

标签: authentication loopbackjs

我创建了一个任务模型,它可以选择存储有关其所有者的信息,以使其成为私有任务。私人任务只能由业主看到。

我现在想检查这个属性,并将其与我编写的自定义远程方法中的当前经过身份验证的用户进行比较。

这可以在Loopback中使用吗?

2 个答案:

答案 0 :(得分:0)

Loopback具有为此类权限检查定义的非常好的ACL功能。

假设您的模型名称为PrivateTask,它存储有关其所有者的信息,现在添加权限,以便只有所有者可以通过设置这样的ACL来查看。

  

模型/私钥task.json

{
   ...
   ...
   "acl":[
       {
          "accessType": "*",
          "principalType": "ROLE",
          "principalId": "$everyone",
          "permission": "DENY"
       },
       {
         "accessType": "*",
         "principalType": "ROLE",
         "principalId": "$owner",
         "permission": "ALLOW"
       }
   ]

此处,具有权限$everyone并且具有权限DENY的第一个将拒绝all kinds of user想要访问此model的人。角色$owner的第二个权限将允许only owner访问其数据。

有关详细信息,请参阅https://loopback.io/doc/en/lb2/Controlling-data-access.html

答案 1 :(得分:0)

您可以使用current context来做到这一点。

在远程方法定义(在model.js文件中)上,您可以添加一个额外的options参数。从上面的链接中查看此示例:

// common/models/my-model.js
module.exports = function(MyModel) {
  MyModel.log = function(messageId, options) {
    const Message = this.app.models.Message;
    // IMPORTANT: forward the options arg
    return Message.findById(messageId, null, options)
      .then(msg => {
        const token = options && options.accessToken;
        const userId = token && token.userId;
        const user = userId ? 'user#' + userId : '<anonymous>';
        console.log('(%s) %s', user, msg.text));
      });
  };
};

然后,您必须指定模型接受元数据上的options参数。

// common/models/my-model.json
{
  "name": "MyModel",
  // ...
  "methods": {
    "log": {
      "accepts": [
        {"arg": "messageId", "type": "number", "required": true},
        {"arg": "options", "type": "object", "http": "optionsFromRequest"}
      ],
      "http": {"verb": "POST", "path": "/log/:messageId"}
    }
  }
}

用户ID在options.token.userId上可用。