【发布时间】:2018-02-09 22:34:42
【问题描述】:
我需要从我的流星应用程序中提供一些 REST API 端点。
端点必须在服务器端可访问,因此我使用 Iron 路由器进行服务器端路由。
一切正常,但现在我需要访问this.params 进行权限检查。
我目前的路线:
Router.route('myServerRoute', {
where: "server",
path: '/api/v1/doit/:partner',
onBeforeAction: function(req, res, next) {
API.beforeAction(req, res, next, ['admin','API']);
}
})
API.beforeAction 是我用来验证用户令牌的函数(此令牌位于其中一个标头中)
此函数检查令牌是否有效以及该用户是否具有第 4 个参数中的角色之一。
:partner 是使用 API 的合作伙伴的名称。
假设:partner 是'store1' (/api/v1/doit/store1)
我想验证只有具有store1 角色的用户 才能访问/api/v1/doit/store1 URL
所以我想将:partner参数的值传递给API.beforeAction函数
在onBeforeAction 函数上,我无权访问 this.params(它是空的)
有些人建议使用Router.current()访问参数
但这是一个客户端调用,它在服务器端不可用。
我可以使用req.url,解析它并获取合作伙伴名称。但是当我知道 Iron Route 已经解析了这个 URL 时,我不喜欢自己进行解析
对如何获取onBeforeAction 中的 URL 参数有什么建议吗?
【问题讨论】:
-
奇怪,[iron router guide section on hooks](iron-meteor.github.io/iron-router/#using-hooks说“路由函数中所有可用的属性也都在这里可用,例如this.params”
-
@MichelFloyd,是的,我也这么认为...我尝试打印它 [console.log("params:",JSON.stringify(this.params, null, 2));]但它只是打印出一个空数组。我怀疑“this.params”仅在客户端路由上可用。
-
哦,是的,服务器端。你能把你的角色检查放在路由操作的前面吗?
-
@MichelFloyd,是的,我可以。有几件事我不喜欢它:一些端点有 .post、.get、.put 和 .delete 动作……这意味着我必须为每个端点类型复制对我的新“globalValidatePermission”函数的调用不仅每条路线一次。 - 另外,从安全角度来看,我更喜欢未经许可的用户甚至不会开始运行实际的 Endpoint 代码。我以前不想抓住它。尽快
-
那我觉得你在解析
req.url
标签: meteor iron-router