我使用的是koa2和koa路由器,上面还有后缀。我希望能够根据他们在数据库中的角色来控制用户的访问,到目前为止,它已经开始工作了。我自己实现了RBAC,但我遇到了一些麻烦。
如果用户没有访问权限,我需要在任何端点被击中之前退出执行,考虑到端点可以执行任何操作(比如插入一个新项等等)。这是完全合理的,我意识到我可能会使用带有后缀的事务,但我发现这会增加更多的开销,最后期限即将到来。
到目前为止,我的实现有点类似于以下内容:
// initialize.js
initalizeRoutes()
initializeServerMiddleware()
服务器中间件在路由之后注册。
// function initializeRoutes
app.router = require('koa-router')
app.router.use('*', access_control(app))
require('./routes_init')
routes_init只运行一个函数,该函数递归地解析一个文件夹并导入所有中间件定义。
// function initializeServerMiddleware
// blah blah bunch of middleware
app.server.use(app.router.routes()).use(app.router.allowedMethods())
这只是普通的考拉路由器。
然而,这个问题出现在access_control中。
我有一个文件(access_control_definitions.js),其中我指定了命名路由、它们各自的续集模型名称,以及路由存在哪些规则。(例如,如果所有者能够访问自己的资源.)我通过路由param计算请求者是否拥有资源(例如,资源ID是ctx.params.id
)。然而,在这个实现中,params似乎没有被解析。我不认为这是正确的,我必须手动解析之前,考拉-路由器做它。有谁能够在此基础上找出一种更好的方法来解决ctx.params
没有被实际命名的参数填充的问题?
编辑:我还为此创建了一个GitHub问题,考虑到在我看来有一些有趣的事情在进行。
发布于 2018-04-09 03:08:09
所以如果你看看router.js
layerChain = matchedLayers.reduce(function(memo, layer) {
memo.push(function(ctx, next) {
ctx.captures = layer.captures(path, ctx.captures);
ctx.params = layer.params(path, ctx.captures, ctx.params);
ctx.routerName = layer.name;
return next();
});
return memo.concat(layer.stack);
}, []);
return compose(layerChain)(ctx, next);
它所做的是,对于您拥有的每一个路由函数,它都会添加自己的捕获层来生成params。
现在,这确实是有意义的,因为您可以为同一个url提供两个具有不同参数的中间件。
router.use('/abc/:did', (ctx, next) => {
// ctx.router available
console.log('my request came here too', ctx.params.did)
if (next)
next();
});
router.get('/abc/:id', (ctx, next) => {
console.log('my request came here', ctx.params.id)
});
现在,对于第一个处理程序,参数id
没有意义,对于第二个参数,did
没有任何意义。这意味着这些参数是特定于处理程序的,并且只有在处理程序中才有意义。这就是为什么没有你所期望的平行线是有意义的。我不认为这是个虫子
既然你已经找到了解决办法
const fromRouteId = pathToRegexp(ctx._matchedRoute).exec(ctx.captures[0])
你应该用同样的。或者一个更好的
var lastMatch = ctx.matched[ctx.matched.length-1];
params = lastMatch.params(ctx.originalUrl, lastMatch.captures(ctx.originalUrl), {})
https://stackoverflow.com/questions/49689406
复制相似问题