我创建了一个任务模型,它可以选择存储有关其所有者的信息,以使其成为私有任务。私人任务只能由业主看到。
我现在想检查这个属性,并将其与我编写的自定义远程方法中的当前经过身份验证的用户进行比较。
这可以在Loopback中使用吗?
答案 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
上可用。