特定路由的快速 ip 过滤器?

Posted

技术标签:

【中文标题】特定路由的快速 ip 过滤器?【英文标题】:Express ip filter for specific routes? 【发布时间】:2017-05-27 01:33:42 【问题描述】:

是否可以对不同的路由应用不同的 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);

但我想要针对不同路线使用不同的过滤器。

可以这样做吗?

【问题讨论】:

【参考方案1】:

警告:包 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);

或者限定中间件的使用:

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);

【讨论】:

您确定 express-ipfilter 现在已被弃用吗? express-ipfilter 最后一次发布是在 2 个月前,而 express-ip-filter(带连字符)最后一次发布是在 3 年前【参考方案2】:

在你定义应用程序的主文件中,

app.use('/test',require('./whereever-my-route-is-located-where /test routes '));
app.use('/',require('./wherever-my-this-routes-are-located'))

在您的路线文件中。

var express = require('express'),
    router = express.Router();
//Ip verification for all requests : for whereever-my-route-is-located-where /test routes 
router.use(function(req, res, next) 
    //verify Ip Logic
);
//this will be called for every route u define in that file, if it fails.

【讨论】:

【参考方案3】:

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

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
    
)

您可能需要确保requestIP 的格式正确。

【讨论】:

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

以上是关于特定路由的快速 ip 过滤器?的主要内容,如果未能解决你的问题,请参考以下文章

如何快速录制带有特定阈值过滤器的音频

Java 微服务之 SpringCloud快速入门day02 Zuul网关,面向服务的路由,Zuul过滤器

Java 微服务之 SpringCloud快速入门day02 Zuul网关,面向服务的路由,Zuul过滤器

GateWay快速入门

看似快速的过滤器字段查找速度很慢

ACL