【发布时间】:2017-03-29 03:20:59
【问题描述】:
我正在使用 Loopback3。我的 ACL 角色遇到了问题,我不确定我做错了什么。我希望具有特定角色的用户能够将数据写入端点,并且由于某种原因,我设置的用户(处于这些角色之一)无法写入。我收到需要授权错误。
我有 4 个角色:
- 管理员
- 内部
- 外部
- 机器人
对于此端点,所有经过身份验证的用户都可以读取数据,但只有 admin、internal 和 bot 用户可以写入数据,并且只有 admin 用户可以删除数据。
这是我定义 ACL 的方式:
"acls": [
{
"accessType": "*",
"principalType": "ROLE",
"principalId": "$everyone",
"permission": "DENY"
},
{
"accessType": "READ",
"principalType": "ROLE",
"principalId": "$authenticated",
"permission": "ALLOW"
},
{
"accessType": "WRITE",
"principalType": "ROLE",
"principalId": "admin",
"permission": "ALLOW"
},
{
"accessType": "WRITE",
"principalType": "ROLE",
"principalId": "internal",
"permission": "ALLOW"
},
{
"accessType": "WRITE",
"principalType": "ROLE",
"principalId": "bot",
"permission": "ALLOW"
},
{
"accessType": "DELETE",
"principalType": "ROLE",
"principalId": "admin",
"permission": "ALLOW"
}
],
我设置了两个用户,一个是机器人,一个是管理员。当我为任一用户向 API 发出 POST 请求时,我会收到“需要授权”错误,即使是从资源管理器界面执行此操作也是如此。我可以毫无问题地执行 GET,但 POST 会失败。
如果我删除所有“WRITE” acl 并用它替换它们,则执行 POST 即可。
{
"accessType": "WRITE",
"principalType": "ROLE",
"principalId": "$authenticated",
"permission": "ALLOW"
},
所以,我可以实现它,但我不知道为什么我的自定义角色会失败。
编辑:这是我创建用户的方式,因为我实际上还没有构建任何类型的界面。
module.exports = function (app) {
let today = new Date();
let admin = {
name: 'admin',
description: 'admin users',
created: today.toJSON(),
modified: today.toJSON()
};
let internal = {
name: 'internal',
description: 'Internal users',
created: today.toJSON(),
modified: today.toJSON()
};
let external = {
name: 'external',
description: 'external users',
created: today.toJSON(),
modified: today.toJSON()
};
let bot = {
name: 'bot',
description: 'robots',
created: today.toJSON(),
modified: today.toJSON()
};
let model = app.models.user;
model.create([
{username: 'bot', email: 'example@example.com', password: 'test123'},
{username: 'admin', email: 'example2@example.com', password: 'test123'},
{username: 'iAdmin', email: 'example3@example.com', password: 'test123'},
{username: 'eUser', email: 'example4@example.com', password: 'test123'},
], function(err, users) {
if (err) throw err;
app.models.Role.create(bot, function (err, botRole) {
if (err) throw err;
botRole.principals.create({principalType: app.models.RoleMapping.user, principalID: users[0].id}, function(err, principal) {
if (err) throw err;
});
});
app.models.Role.create(admin, function (err, adminRole) {
if (err) throw err;
adminRole.principals.create({principalType: app.models.RoleMapping.user, PrincipalID: users[1].id}, function(err, principal) {
if (err) throw err;
});
});
app.models.Role.create(admin, function (err, internalRole) {
if (err) throw err;
internalRole.principals.create({principalType: app.models.RoleMapping.user, PrincipalID: users[2].id}, function(err, principal) {
if (err) throw err;
});
});
app.models.Role.create(external, function (err, externalRole) {
if (err) throw err;
externalRole.principals.create({principalType: app.models.RoleMapping.user, PrincipalID: users[3].id}, function(err, principal) {
if (err) throw err;
});
});
});
};
【问题讨论】:
-
可能问题出在您创建角色并将其与用户关联的位置。
-
可能我已经添加了用于创建用户的脚本。
-
我相信他们应该是
app.models.RoleMapping.USER而不是app.models.RoleMapping.user -
好收获!我为此进行了更改,但它似乎仍然没有影响任何东西。
-
这就像 Loopback 已经拥有的动态角色(如
$everyone和$authenticated)工作得很好,但我所有的自定义角色都被忽略了。
标签: acl loopbackjs strongloop loopback