我使用loopback为SPA网站创建一个简单的API。我想让我的权限尽可能简单,所以我最终得到了以下ACL模型
User
模型的权限,因此我创建了admin
模型,该模型扩展了User
。然后我将public
模型的User
属性设置为false。我设置了以下ACL规则
{
"accessType": "*",
"principalType": "ROLE",
"principalId": "$everyone",
"permission": "DENY"
},
{
"accessType": "EXECUTE",
"principalType": "ROLE",
"principalId": "$everyone",
"permission": "ALLOW",
"property": "login"
},
{
"accessType": "*",
"principalType": "ROLE",
"principalId": "$authenticated",
"permission": "ALLOW"
}
在我看来,它应该拒绝任何非正式用户访问login
以外的任何方法。
不幸的是,这不是它的工作原理,任何人仍然可以POST / users并创建新用户。我的猜测是ACL规则不适用于继承的模型,因此User
的规则适用于此处。所以我回到原点,我无法直接更改User
权限或覆盖它们。
我有什么选择?有没有办法阻止创建新用户?
答案 0 :(得分:3)
事实证明,规则细节比继承级别更重要。在这种情况下,User
模型专门为create
属性定义规则。此规则优先于更一般的拒绝每个属性,即使在扩展的admin
模型中定义了拒绝规则。因此,我必须从User
模型中获取所有允许的规则,并在admin
中明确拒绝这些规则。
答案 1 :(得分:0)
几天前我遇到了同样的问题,我找到了解决方案。回送默认 POST /用户规则是每个人都可以插入用户。因此,您的管理模型是从用户模型继承的,因此规则也被继承。我们将不得不在您的管理模型中覆盖创建权限。 Loopback User model Default permission for POST
只需将 common / models / admin.json
中的acl对象放在下面...
acl : [{
"principalType": "ROLE",
"principalId": "$everyone",
"permission": "DENY",
"property": "create"
},{
"principalType": "ROLE",
"principalId": "$authenticated",
"permission": "ALLOW",
"property": "create"
}]
...
因此,您将通过覆盖默认规则来首先拒绝访问每个人,并将规则设置为只能发布的 $ authenticated 。 您可以根据需要设置规则。