我正在通过IP ACL处理客户端访问。
function localAcl (options) {
let {allowedMethods} = options
if (!Array.isArray(allowedMethods)) {
allowedMethods = []
}
return function(req, res, next) {
if (allowedMethods.includes(req.method)) {
next()
} else {
(ipAccessControl(options))(req, res, next)
}
}
}
app.use('/api/v1', localAcl(options), apiV1Router)
上面读取一个配置文件并决定是否接受。
现在,我想添加一个新的中间件,它从web文件中读取另一个配置文件并决定权限。
function newAcl () {
...
switch(result) {
case SUCCESS:
next();
break;
case FAIL:
next(new Error('Access Denied'));
break;
}
}
//something like this..
我想先与localAcl检查权限。
如果localAcl接受,我不希望检查newAcl,并且将处理该请求。
如果localAcl拒绝,我希望newAcl再次检查,如果newAcl接受,则应该处理该请求。
我该如何连接这两个?
我看到两个选项
- 使用
next('route')
跳过其余的中间件功能 - 以编程方式处理授权,让最后一个中间件决定
对于您所描述的,第一个选项似乎是一个更好的选项
跳过路由器中间件的其余中间件功能堆栈,调用next('route'(将控制权传递给下一个路由。
注意:next('route'(将仅在已加载的中间件函数中工作通过使用该应用程序。METHOD((或路由器。METHOD((函数。
源
这意味着您可能应该在ipAccessControl
函数中调用next('route')
。