【发布时间】:2017-05-10 19:49:27
【问题描述】:
我尝试使用以下模型在 LoopBack 3 API 中管理我的用户管理:
{
"name": "Employee",
"plural": "Employees",
"base": "User",
"idInjection": true,
"options": {
"validateUpsert": true,
"strict": true
},
"mixins": {
"ClearBaseAcls": true
},
"hidden": [
"password",
"verificationToken"
],
"properties": {
"name": {
"type": "string",
"required": true
},
"family": {
"type": "string",
"required": true
}
},
"validations": [],
"relations": {},
"acls":
[ { "principalType": "ROLE", "principalId": "$everyone", "permission": "DENY" },
{ "principalType": "ROLE", "principalId": "$everyone", "permission": "ALLOW", "property": "login" },
{ "principalType": "ROLE", "principalId": "$everyone", "permission": "ALLOW", "property": "logout" },
{ "principalType": "ROLE", "principalId": "$everyone", "permission": "ALLOW", "property": "confirm" },
{ "principalType": "ROLE", "principalId": "admin", "permission": "ALLOW" },
{ "principalType": "ROLE", "principalId": "$owner", "permission": "ALLOW", "property": "findById" },
{ "principalType": "ROLE", "principalId": "$owner", "permission": "ALLOW", "property": "updateAttributes" }
],
"methods": {}
}
并且也使用这个 mixis: (ClearBaseAcls)
'use strict';
const path = require('path');
const appRoot = require('app-root-path');
function slugify(name) {
name = name.replace(/^[A-Z]+/, s => s.toLowerCase());
return name.replace(/[A-Z]/g, s => '-' + s.toLowerCase());
}
module.exports = (Model) => {
const configFile = path.join('./common/models/', slugify(Model.modelName) + '.json');
const config = appRoot.require(configFile);
if (!config || !config.acls) {
console.error('ClearBaseAcls: Failed to load model config from', configFile);
return;
}
Model.settings.acls.length = 0;
config.acls.forEach(r => Model.settings.acls.push(r));
};
现在对我来说一切都很好。
只有admin可以创建新用户并做任何事情。
$everyone只能login、退出并确认帐户。
但我对 $owner 部分有一些问题。由于管理员创建的用户现在“管理员”是任何其他用户的所有者,没有人不能使用 findById 或 updateAttributes(更新配置文件)。
更新:
我再次测试,新用户可以使用 findById ( GET /Employees/{id} ) (我不知道它为什么有效,但这就是我们所需要的)BUUUUT 另一个问题,新用户不能使用 updateAttributes ( PATCH / Employees/{id} )并显示以下错误:
Authorization Required
为什么 findById ( GET /Employees/{id} ) 有效??
为什么是 updateAttributes ( PATCH /Employees/{id} )??
为什么这两个不一样?
你能指导我如何解决这个问题吗?我找不到任何关于此的信息。
【问题讨论】:
-
您是否使用与用户连接的同一 ID? $owner 只能通过关系直接连接到 $owner 的主题。要使 updateAttributes 起作用,它必须是用户所附加的员工 ID。
-
嗨@Undrium,是的,我使用的是同一个ID。我认为这是一个错误。请看这个问题:github.com/strongloop/loopback/issues/3379
标签: javascript node.js acl loopbackjs loopback