我正在使用ACL规则来阻止来自所有用户的所有类型的访问。它适用于GET访问,但它不适用于POST访问。
知道可能出现什么问题吗?
以下是代码和示例结果:
/common/models/client.json
{
"name": "client",
"plural": "clients",
"base": "User",
"idInjection": true,
"properties": {},
"validations": [],
"relations": {},
"acls": [
{
"accessType": "*",
"principalType": "ROLE",
"principalId": "$everyone",
"permission": "DENY"
}
],
"methods": {}
}
GET访问错误(按预期工作,已被阻止):
CURL
curl -X GET --header "Accept: application/json" "http://localserver:8080/api/quants"
RESPONSE
{
"error": {
"name": "Error",
"status": 401,
"message": "Authorization Required",
"statusCode": 401,
"code": "AUTHORIZATION_REQUIRED",
"stack": "Error: Authorization Required\n at ...
}
}
发布错误,访问权限未被阻止。不工作。
CURL:
curl -X POST --header "Content-Type: application/json" --header "Accept: application/json" -d "{
\"email\": \"test@email.com\",
\"password\": \"abcd1234\"
}
" "http://localserver:8080/api/clients"
RESPONSE
{
"email": "test@email.com",
"id": "46b258078da5dtg1ji5809ww"
}
答案 0 :(得分:3)
在提出解决方案之前,我会尝试解释“创建”的原因是什么? (POST)方法不被拒绝。
您的client
模型是Loopback的User
内置模型的子模型。
在这种情况下要记住两件重要的事情:
在子模型中定义的ACL 不会覆盖基类ACL ,but merged to them。
当针对ACL检查请求时,Loopback的算法会使 close 匹配更高的权重。在这种特定情况下,更接近的匹配是更具体的ACL定义。 (参考here)
现在,Loopback' User
模型contains the following ACL:
{
"principalType": "ROLE",
"principalId": "$everyone",
"permission": "ALLOW",
"property": "create"
}
您定义的ACL
{
"accessType": "*",
"principalType": "ROLE",
"principalId": "$everyone",
"permission": "DENY"
// no specific property
}
不太具体,因此不会被算法选择。
为了解决这个问题,您可以:
添加用于拒绝创建的特定ACL:
{
"principalType": "ROLE",
"principalId": "$everyone",
"permission": "DENY",
"property": "create"
}
删除允许从基础User
模型创建的ACL(非常糟糕的解决方案,但有效)