针对特定路线的Express ip过滤器?

Bri*_*ian 4 ip access-control node.js express

是否可以将不同的ip过滤器应用于不同的路由?

例如,我只希望123.123.123.123的人可以访问我的服务器/test路由,只有来自124.124.124.124的人才能访问我服务器的/路由.

我知道express-ipfilter可以通过IP地址限制站点访问.但它不能将过滤器应用于特定路线.

我也知道app.use(ipfilter(ips, {}));在路由中间添加只能对以下路由应用过滤器:

var express = require('express'),
    ipfilter = require('express-ipfilter').IpFilter;

var ips = ['::ffff:127.0.0.1'];
var app = express();

app.get('/test', function(req, res) {
    res.send('test');
});

app.use(ipfilter(ips, {})); // the ipfilter only applies to the routes below

app.get('/', function(req, res) {
    res.send('Hello World');
});

app.listen(3000);
Run Code Online (Sandbox Code Playgroud)

但我想为不同的路线使用不同的过滤器.

是否有可能做到这一点?

Jer*_*son 6

是的,这是可能的。你可以这样做:

app.get('/test', function(req, res){
    var trustedIps = ['123.123.123.123'];
    var requestIP = req.connection.remoteAddress;
    if(trustedIps.indexOf(requestIP) >= 0) {
        // do stuff
    } else {
        // handle unallowed ip
    }
})
Run Code Online (Sandbox Code Playgroud)

不过,您可能需要确保其requestIP格式正确。

  • 如果您需要在多个路由上实现它,+1 甚至可以为一个干净的实现编写一个中间件函数。 (3认同)
  • 对于那些使用 Google App Engine 或其他运行 NGINX 的服务器的人来说,这个关于使用 `req.headers['x-forwarded-for']` 获取 IP 地址的答案与上面的方法相关:https://stackoverflow.com /a/10849772/1024735 (2认同)

bsy*_*syk 5

警告:包express-ipfilter现已弃用.

您可以链接中间件(而ipFilter是一个中间件).有两种方法可以做到这一点:

var express = require('express'),
    ipfilter = require('express-ipfilter').IpFilter;

var ips = ['::ffff:127.0.0.1'];
var testers = ['1.2.3.4'];
var app = express();

app.get('/test', ipfilter(testers, {mode: 'allow'}), function(req, res) {
    res.send('test');
});


// the ipfilter only applies to the routes below  
app.get('/', ipfilter(ips, {mode: 'allow'}), function(req, res) {
    res.send('Hello World');
});

app.listen(3000);
Run Code Online (Sandbox Code Playgroud)

或者限定使用中间件:

var express = require('express'),
    ipfilter = require('express-ipfilter').IpFilter;

var ips = ['::ffff:127.0.0.1'];
var testers = ['1.2.3.4'];
var app = express();

app.use('/test', ipfilter(testers, {})); // the ipfilter only applies to the routes below    

app.get('/test', function(req, res) {
    res.send('test');
});

app.use('/', ipfilter(ips, {})); // the ipfilter only applies to the routes below

app.get('/', function(req, res) {
    res.send('Hello World');
});

app.listen(3000);
Run Code Online (Sandbox Code Playgroud)

  • 您确定 express-ipfilter 现在已弃用吗?express-ipfilter 上次发布于 2 个月前,而 express-ip-filter(带连字符)上次发布于 3 年前 (8认同)