环回如何从用户基础模型中获取数据
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": {}
}
我希望会员能够获取其关注者,但实现该目标的最佳方式是什么:
- 我是否应该修改默认用户 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;
}
}
]
}
);
你的模型定义和关系看起来不错。
需要更好地分离的是访问控制与业务逻辑。
需要使用每个模型定义中的 acls
属性 来实施访问控制。它不应该由您的远程方法处理,否则您将需要为每个远程方法重复代码,并且您可能有比这更好的事情要做:)
ACLS
首先,对于每个模型,最好向所有人拒绝所有内容。确保您不会在 API.
中留下漏洞是一个很好的做法
然后,授权特定类型的用户使用每个特定的路线或方法。
它之所以有效,是因为非常具体的 acl 规则优先于广泛的 acl 规则。
例如:
Member
all methods
all users
Deny
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
。
的条件下有效
我正在学习环回,我想知道最佳环回实践。 我有一个基于用户默认模型的成员模型和一个跟随模型。一个会员可以有多个粉丝。
{
"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;
}
}
]
}
);
你的模型定义和关系看起来不错。
需要更好地分离的是访问控制与业务逻辑。
需要使用每个模型定义中的 acls
属性 来实施访问控制。它不应该由您的远程方法处理,否则您将需要为每个远程方法重复代码,并且您可能有比这更好的事情要做:)
ACLS
首先,对于每个模型,最好向所有人拒绝所有内容。确保您不会在 API.
中留下漏洞是一个很好的做法然后,授权特定类型的用户使用每个特定的路线或方法。 它之所以有效,是因为非常具体的 acl 规则优先于广泛的 acl 规则。
例如:
Member
all methods
all users
Deny
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
。