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(); });
从文档得到这个。