环回如何从用户基础模型中获取数据

Loopback how to fetch data from User base model

我正在学习环回,我想知道最佳环回实践。 我有一个基于用户默认模型的成员模型和一个跟随模型。一个会员可以有多个粉丝。

{
  "name": "Member",
  "base": "User",
  "idInjection": true,
  "options": {
    "validateUpsert": true
  },
  "properties": {
    "nickname": {
      "type": "string"
    }
  },
  "validations": [],
  "relations": {
    "messages": {
      "type": "hasMany",
      "model": "Message",
      "foreignKey": ""
    },
    "followers": {
      "type": "hasMany",
      "model": "Member",
      "foreignKey": "followeeId",
      "through": "Follow"
    },
    "following": {
      "type": "hasMany",
      "model": "Member",
      "foreignKey": "followerId",
      "through": "Follow"
    }
  },
  "acls": [
    {
      "accessType": "*",
      "principalType": "ROLE",
      "principalId": "$everyone",
      "permission": "ALLOW"
    }
  ],
  "methods": {}
}

这是我的关注模型

{
  "name": "Follow",
  "base": "PersistedModel",
  "idInjection": true,
  "options": {
    "validateUpsert": true
  },
  "properties": {},
  "validations": [],
  "relations": {
    "follower": {
      "type": "belongsTo",
      "model": "Member",
      "foreignKey": ""
    },
    "followee": {
      "type": "belongsTo",
      "model": "Member",
      "foreignKey": ""
    }
  },
  "acls": [],
  "methods": {}
}

我希望会员能够获取其关注者,但实现该目标的最佳方式是什么:

方法定义:

Professionaldemand.remoteMethod(
    'createDemand', {
        http: {
            path: '/createDemand',
            verb: 'post'
        },
        description: ["Permits client to ask for a professional permission"]
        ,
        accepts: [
            {
                arg: 'access_token',
                type: 'object',
                http: function (ctx) {
                    return ctx.req.accessToken;
                }
            }
        ]
    }
);

你的模型定义和关系看起来不错。

需要更好地分离的是访问控制与业务逻辑。

需要使用每个模型定义中的 acls 属性 来实施访问控制。它不应该由您的远程方法处理,否则您将需要为每个远程方法重复代码,并且您可能有比这更好的事情要做:)

ACLS

首先,对于每个模型,最好向所有人拒绝所有内容。确保您不会在 API.

中留下漏洞是一个很好的做法

然后,授权特定类型的用户使用每个特定的路线或方法。 它之所以有效,是因为非常具体的 acl 规则优先于广泛的 acl 规则。

例如:

  1. Member all methods all users Deny
  2. Member __addFollowower__ $owner Allow

这样远程方法 Member.addFollower 将只允许会员 $owner,基本上是会员本人。他将无法代表其他人添加关注者。

正在获取关注者

I want the member to be able to fetch its followers but what is the best way to achieve that. [...] Should I create a new remote method for member to achieve this ?

在这种情况下,您不一定需要创建远程方法,实际上它对于您的关系生成方法来说是多余的。你可以简单地调用

GET api/Member/:id/followers?access_token=e23saa2ragkuljkh2...

如果您不想跟踪 :id 客户端,您也可以使用

GET api/Member/me/followers?access_token=e23saa2ragkuljkh2...

在这种情况下,loopback 将使用访问令牌来确定登录用户的 id,并用此 id 替换 me

PS:这在您 configured loopback to support this.

的条件下有效