LoopBack用户特定的数据过滤/访问

目前正在testing一堆框架以确定我公司未来使用的良好候选人,LoopBack通过几乎完美的需求吸引了我的注意力。

但是,我感觉到他们的ACL模型在某些情况下是相当有限的。 让我们看看以下用例:在合作旅游pipe理网站上,用户可以创build和/或join公共旅行。 我们假设以下API:

  • /Travels列出用户拥有的所有旅行
  • /Travels/public列出所有公共旅行
  • /Travels/{id}/join使用给定的IDjoinTravel

build立这样一个API是否需要重新发明轮子? 或者是一些中间件实施?

每个字段的ACL也是一样。 假设你有一些清单项目,一些手动添加,一些自动生成。 除了更改“完成”字段之外,是否只能在自动写入操作中阻止写入操作?

默认情况下,请求

 GET /Travels 

会列出Travel模型的每个元素。 如果您设置了正确的关系(可能是用户和旅行之间的多对多关系),查询给定用户旅行的正确方法是

 GET /Users/{id}/Travels 

但是,您可以使用钩子,范围自定义Travels.find()的默认行为,甚至可以重载方法原型。

关于/Travels/public这是微不足道的,你只需要创build一个远程方法 。 使用path属性来定制端点。

最后,join/Travels/{id}/join请求的/Travels/{id}/join也将通过远程方法进行pipe理,但这应该是POST请求。

Loopback能够pipe理多对多的关系,而无需指定关系表,但在你的情况下,我宁愿定义它。 例如

 { "name": "UserTravel", "options": { ... }, "properties": { "id":{"type":"Number", "id":1}, "userId":{"type":"Number"}, "travelId":{"type":"Number"} }, "relations": { "Travel": { "type": "belongsTo", "model": "Travel", "foreignKey": "travelId" }, "User": { "type": "belongsTo", "model": "User", "foreignKey": "userId" } } } 

使用这个模型将允许您在调用join端点时插入特定的用户/旅行元组。 您从请求参数中获取travelId,并从请求accessToken中提取userId,然后在应用程序中对用户进行身份validation。

正如@amenadielbuild议的那样,您可以使用挂钩来设置login用户的默认filter:

 MyModel.observe('access', function limitToTenant(ctx, next) { ctx.query.where.tenantId = loopback.getCurrentContext().tenantId; next(); }); 

从文档得到这个。