【问题标题】:Loopback how to fetch data from User base model环回如何从用户基础模型中获取数据
【发布时间】:2017-03-10 23:01:43
【问题描述】:

我正在学习 Loopback,我想了解最佳的 Loopback 做法。 我有一个基于用户默认模型的成员模型和一个跟随模型。一个成员可以有很多关注者。

{
  "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": {}
}

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

  • 我是否应该修改默认用户 ACL 以便能够从 Member with /Members/{id}/followers(当前被阻止)获取数据?
  • 我应该为成员创建一个新的远程方法来实现这一点吗?最好的方法是什么?我是否应该像使用 accesstoken 的另一种方法一样检查成员身份(下面的示例)?

    Professionaldemand.createDemand = function (accessToken, cb) {
    //Rejection if not an authenticated User
    if (!accessToken) {
        return errorUtility.CallbackError("Access Token is not valid", 400, cb);
    }
    
    var currentDate = new Date();
    Professionaldemand.create({ Acceptation: false, CreationDate: currentDate, memberId: accessToken.userId },
        function (err) {
            if (err) {
                return errorUtility.CallbackError("Professionaldemand creation error", 400, cb);
            }
        }, cb(null));
    };
    

方法定义:

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;
                }
            }
        ]
    }
);

【问题讨论】:

    标签: node.js loopbackjs strongloop loopback


    【解决方案1】:

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

    需要更好的将访问控制与业务逻辑分开。

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

    ACLS

    首先,对于每个模型,拒绝所有人的一切是一种很好的做法。确保您不会在 API 中留下漏洞是一种很好的做法。

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

    例如:

    1. Memberall methodsall usersDeny
    2. Member __addFollowower__ $owner Allow

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

    获取关注者

    我希望会员能够获取其关注者,但实现这一目标的最佳方式是什么。 [...] 我应该为成员创建一个新的远程方法来实现这一点吗?

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

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

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

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

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

    PS:这在你configured loopback to support this的条件下有效。

    【讨论】:

    • 非常感谢您的回答,对我帮助很大! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多