我创建了一个名为“ShippingAddresses”的模型,它具有以下ACL规则。
[
{
"accessType": "*",
"principalType": "ROLE",
"principalId": "$everyone",
"permission": "DENY"
},
{
"accessType": "READ",
"principalType": "ROLE",
"principalId": "$owner",
"permission": "ALLOW"
},
{
"accessType": "EXECUTE",
"principalType": "ROLE",
"principalId": "$authenticated",
"permission": "ALLOW",
"property": "create"
},
{
"accessType": "WRITE",
"principalType": "ROLE",
"principalId": "$owner",
"permission": "ALLOW"
}
]
当我通过在端点/ api / shipping_addresses上进行POST调用来创建记录时,它可以正常工作,但是当我在同一端点/ api / shipping_addresses上发出GET请求时,它无效。
另外,只是为了旁注,我使用Account(继承用户)定义了ShippingAddresses模型的关系。关系是:用户 - > hasMany ShippingAddress,ShippingAddress - > belongsTo Account。
我阅读了关于Loopback官方文档的ACL文档,但我迷路了。一切似乎设置正确但仍然获得401:需要授权。
答案 0 :(得分:2)
问题在于 READ 权限,因为您只将其设置为 $ owner 。它的含义是:只有模型实例的所有者才能查看该实例。因此,只有当您为与所有者(User)相关的实例传递id时,它才会起作用,即与findById()相同。
另外请注意,在使用所有权来建立模型实例时,您必须将它们与“属于”相关联。它将要做的是将userId添加到模型实例,以便环回知道该模型实例属于谁。此外,它还会创建新的休息端点。例如:
User.modelname.create() //this way modelname instance is created for User.
//User is the owner of current modelname instance.
否则,如果您想允许所有人访问 GET 其他终结点,请使用以下 ACL 。
[
{
"accessType": "*",
"principalType": "ROLE",
"principalId": "$everyone",
"permission": "DENY"
},
{
"accessType": "READ",
"principalType": "ROLE",
"principalId": "$everyone",
"permission": "ALLOW"
},
{
"accessType": "EXECUTE",
"principalType": "ROLE",
"principalId": "$authenticated",
"permission": "ALLOW",
"property": "create"
},
{
"accessType": "WRITE",
"principalType": "ROLE",
"principalId": "$owner",
"permission": "ALLOW"
}
]
答案 1 :(得分:0)
ACL是loopback框架的一个特性。 与其他框架相比,它对nodejs开发很有用。 看到你的问题将为模型正确创建将改变角色。 首先,您参考身份验证和回送的authrotation
将为models / script.js添加编码 https://github.com/strongloop/loopback-example-access-control/blob/master/common/models/project.js
答案 2 :(得分:0)
环回ACL破坏了我的半天时间。
我的问题是另一个问题(关于错误的角色映射数据),但我认为使它起作用的过程是相同的。
我的解决方案:
DEBUG=loopback:security:*
->(在控制台中)Lb告诉我它无法获取角色映射string
,而不是mongo的ObjectID
@achintverma问题:
{
"accessType": "*",
"principalType": "ROLE",
"principalId": "$everyone",
"permission": "DENY"
},
{
"accessType": "READ",
"principalType": "ROLE",
"principalId": "$owner",
"permission": "ALLOW"
},
以上conf表示$owner ALLOW READ
优先于$everyone DENY *
。
如果设置了调试,我会看到类似的东西:
loopback:security:acl with score: 7495 +0ms
因此7495
是每种配置的分数,将选择最大的分数。
但是当我在同一端点/ api / shipping_addresses上发出GET请求时 它不起作用。
肯定是因为当前用户不是$owner
。