【问题标题】:HasMany relation entry point unauthorized on Loopback环回上未经授权的 HasMany 关系入口点
【发布时间】:2017-07-30 22:27:53
【问题描述】:

Loopback 新手,我尝试使用用户模型和待办事项模型制作一个简单的 API。

名为 Todoer 的用户模型基于内置的用户模型。创建一个待办事项,登录,注销等就像一个魅力。 Todo 模型基于 PersistedModel,目前没有特殊的 ACL。

我从 Todo 模型到 Todoer 模型建立了一个 Belongs To 关系以获得所有权。 我还建立了从 TodoerTodoHasMany 关系,以便能够通过端点 GET / 检索用户的所有待办事项Todoer/{id}/todos

使用良好的令牌和 ID 登录 todoer 后,我可以轻松地获得来自 Todoer 端点的响应,为登录用户保留,例如 GET /Todoer/{id},因此我确信身份验证机制运行良好。

但每次我想点击GET /Todoer/{id}/todos,我只会收到一条错误消息,告诉我没有被授权。我始终确定我提供了登录时获得的良好令牌和 Todoer Id。

即使我在 Todoer 模型上创建一个大的 ACL 告诉所有人一切正常,它也会发生同样的情况。

我错过了什么?我想不通...

感谢您的帮助...

【问题讨论】:

  • 您能分享您的 ACL 甚至整个 Todoer.jsonTodo.json 文件吗?第一眼看上去还不错。访问相关模型时,活动 ACL 仍然是您正在调用的模型的 ACL。因此,允许Todoer 上的所有内容应该完全打开相关的Todos。
  • 好的。这里是 todoer.json :{ ` "name": "Todoer",` "base": "User",` "idInjection": true,` "options": {` ` "validateUpsert": true``},``“properties”:{},`“validations”:[],`“relations”:{``“todos”:{``“type”:“hasMany”,``“模型”:“Todo”,``“foreignKey”:“todoerId”``}``},`“acls”:[``{``“accessType”:“*”,`“principalType”:“ ROLE",` "principalId": "$everyone",` "permission": "ALLOW"` }` ` ],` "methods": {}` }
  • 这里是 todo.json : { "name": "Todo", "base": "PersistedModel", "idInjection": true, "options": { "validateUpsert": true } ,“属性”:{“文本”:{“类型”:“字符串”,“必需”:真},“完成”:{“类型”:“布尔”,“默认”:假}},“验证” :[],“关系”:{“todoer”:{“类型”:“belongsTo”,“模型”:“Todoer”,“foreignKey”:“todoerId”}},“acls”:[],“方法” : {} }
  • 为了便于理解,您可以在 ACL 中看到我在 todoer 模型上打开了所有内容。但是当我点击 GET todoer/Id/todos 时,我仍然得到这个:{“error”:{“statusCode”:401,“name”:“Error”,“message”:“Autorisation requise”,“code”:“ AUTHORIZATION_REQUIRED", "stack": "错误:自动化要求\n [...] } }
  • 您也可以编辑您的问题以获得代码格式,但谢谢!我已经发布了我的答案。希望对你有帮助!

标签: acl loopback ownership


【解决方案1】:

您需要考虑内置 Usermodel 的 ACL。您实际上遇到了它的一般DENY ACL 规则。它优先于您的一般 ALLOW ACL 规则(docs on ACL 规则优先级)。

您可以编写更具体的 ACL 规则以通过它(docs on 访问相关模型)。

{
  "accessType": "*",
  "principalType": "ROLE",
  "principalId": "$everyone",
  "permission": "ALLOW",
  "property": "__get__todos"
}

在这种情况下可能更方便和安全的另一种选择是在Todo 本身上使用动态$owner 角色(docs动态角色上)。

{
  "accessType": "*",
  "principalType": "ROLE",
  "principalId": "$owner",
  "permission": "ALLOW"
}

如果您想了解应用程序中的 ACL 发生了什么,将 DEBUG 环境变量设置为 loopback:security:* 以启用相当广泛的安全日志记录非常有用。

【讨论】:

  • 非常感谢,现在可以完美运行了。我不明白内置用户模型的拒绝 ACL 优先于我的授权规则。然后,我将 GET todoers/id/todos 的访问权限限制为经过身份验证的用户,现在它完全符合我的要求。祝你有美好的一天!
  • 太棒了。如果这个答案解决了你的问题,可以请accept吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-12
  • 2022-11-08
  • 2023-03-09
相关资源
最近更新 更多