【问题标题】:Loopback - Set ACL on Object levelLoopback - 在对象级别设置 ACL
【发布时间】:2016-02-11 14:09:49
【问题描述】:

我已成功添加“类”级 ACL,只允许授权用户访问我的模型:

.../server/ModelObj.js

"acls": [
  {
    "accessType": "*",
    "principalType": "ROLE",
    "principalId": "$unauthenticated",
    "permission": "DENY"
  }
]

这很好,但我的应用程序需要更低级别的 ACL - 对象级别。

当属于某个角色的用户创建新对象时,该对象必须只能由具有相同角色的其他用户访问。

这是解决 Loopback 问题的方法,还是提供不同的方法?

提前致谢, 杰斯珀。

【问题讨论】:

    标签: javascript acl loopbackjs strongloop


    【解决方案1】:

    我认为您可能必须使用自定义 role resolver 来实现这一点。这个想法是创建一个角色和一个自定义解析器,并确定用户在运行时对给定模型的访问权限。这是一个部分示例(请注意,您还需要创建角色和成员等)。

    // perhaps in a boot script?
    app.models.Role.registerResolver('teamMember', function(role, context, cb) {
      if (context.modelName === 'ModelObj') {
        context.model.findById(context.modelId, function(err, instance) {
          if (err) { /* handle it... */ return cb(err); }
          // check the instance for something to determine access
          // execute callback with switch for access (or not)
          cb(null, true);
        }
      }
    });
    

    【讨论】:

    • 感谢您的建议 - 我实际上是通过这种方式实现了自己的修复。它有效,但我确实认为它是一个非常手动的过程来实现对大多数应用程序来说相当常见的东西。感谢您对我的问题和解决方案的确认:)
    • 您有什么简单的解决方案可以在应用程序范围内提供此功能吗?现在,如果您请求数据库中的特定对象,则此方法有效,但如果您请求所有对象,则不会设置。不要忘记,更新等等。
    • 我想你可以使用 access 操作钩子。
    【解决方案2】:

    本周我启动了loopback mixin 来支持对象级别的acls。我们需要实例级别的动态 acl,它可能会随着时间而改变。我们看到了您的问题并进行了搜索以找到一些可以有人支持此的插件/mixin/中间件,但我们什么也没找到。

    如果您仍然对此感兴趣,我将非常高兴收到您的反馈,因为我想让这个 mixin 可以在任何地方工作,而不仅仅是在我们的产品上。

    我的计划是本周发布第一个版本。从周一开始,我在对象级别制作了一个简单的同步 acl 库。后来我添加了作为 loopback-mixin 的支持,并支持可以获取数据以做出决定的解析器。我想添加对制作“糖”层的支持,其中一个简单的属性可以制作 acls。因此,如果您的模型具有属性“stock”,那么如果 stock 小于 1,则没有人可以调用方法“buy”。

    谢谢!

    【讨论】:

    • 是的,我很乐意讨论您的方法!我们目前正在生产中运行定制开发的解决方案,结果很有希望。怎么联系你?
    • 大家好,我的团队已经开源了我们的解决方案来解决这个问题:github.com/jesperbruunhansen/loopback-object-acl。任何反馈或帮助表示赞赏!
    猜你喜欢
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多