如何添加新的ACL中间件



我正在通过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接受,则应该处理该请求。

我该如何连接这两个?

我看到两个选项

  1. 使用next('route')跳过其余的中间件功能
  2. 以编程方式处理授权,让最后一个中间件决定

对于您所描述的,第一个选项似乎是一个更好的选项

跳过路由器中间件的其余中间件功能堆栈,调用next('route'(将控制权传递给下一个路由。

注意:next('route'(将仅在已加载的中间件函数中工作通过使用该应用程序。METHOD((或路由器。METHOD((函数。

这意味着您可能应该在ipAccessControl函数中调用next('route')

最新更新