StrongLoop:POST 访问未被阻止
StrongLoop: POST access not being blocked
我正在使用 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"
回应
{
"error": {
"name": "Error",
"status": 401,
"message": "Authorization Required",
"statusCode": 401,
"code": "AUTHORIZATION_REQUIRED",
"stack": "Error: Authorization Required\n at ...
}
}
POST 错误,访问没有被阻止。不工作。
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"
回应
{
"email": "test@email.com",
"id": "46b258078da5dtg1ji5809ww"
}
在提出解决方案之前,我将尝试解释 'create' (POST) 方法不被拒绝的原因。
您的 client
模型是 Loopback 的 User
内置模型的 sub-model。
在这种情况下要记住两件重要的事情:
sub-model 中定义的 ACL 不会覆盖基础 class ACL 的、but merged to them。
根据 ACL 检查请求时,Loopback 的算法会给予 更接近 匹配更高的权重。在这种特定情况下更接近匹配的是 更具体的 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(非常糟糕的解决方案,但有效)
我正在使用 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"
回应
{
"error": {
"name": "Error",
"status": 401,
"message": "Authorization Required",
"statusCode": 401,
"code": "AUTHORIZATION_REQUIRED",
"stack": "Error: Authorization Required\n at ...
}
}
POST 错误,访问没有被阻止。不工作。
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"
回应
{
"email": "test@email.com",
"id": "46b258078da5dtg1ji5809ww"
}
在提出解决方案之前,我将尝试解释 'create' (POST) 方法不被拒绝的原因。
您的 client
模型是 Loopback 的 User
内置模型的 sub-model。
在这种情况下要记住两件重要的事情:
sub-model 中定义的 ACL 不会覆盖基础 class ACL 的、but merged to them。
根据 ACL 检查请求时,Loopback 的算法会给予 更接近 匹配更高的权重。在这种特定情况下更接近匹配的是 更具体的 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(非常糟糕的解决方案,但有效)