前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Egg 中使用中间件屏蔽用户IP

Egg 中使用中间件屏蔽用户IP

作者头像
越陌度阡
发布2020-11-26 12:49:48
8710
发布2020-11-26 12:49:48
举报

中间件是在匹配路由前、匹配路由后做的一系列的操作,Egg 是基于 Koa 实现的,所以 Egg 的中间件形式和 Koa 的中间件形式是一样的,都是基于洋葱圈模型,下面用一个实例来介绍在Egg中如何使用中间件,以屏蔽用户IP为例。

首先在 config 文件夹中的 config.default.js 中配置中间件。

代码语言:javascript
复制
'use strict';
module.exports = appInfo => {
    const config = exports = {};
    // use for cookie sign key, should change to your own and keep security
    config.keys = appInfo.name + '_1532656413112_8161';

    // 配置定义的中间件
    config.middleware = ['forbidIp'];
    // 给配置的中间件传入参数,即屏蔽的IP列表
    config.forbidIp = {
        forbidIpList: [
            '127.0.0.1',
            '192.168.0.10'
        ]
    }
    return config;
};

然后在 app 文件夹下的 middlware 中定义中间件文件 forbidIp.js,代码如下:

代码语言:javascript
复制
module.exports = (options, app) => {
    // options: 中间件的配置项,框架会将 app.config[${middlewareName}] 传递进来
    // app: 当前应用 Application 的实例

    // 返回一个异步的方法
    return async function forbidIp(ctx, next) {
        // 接受要屏蔽的IP列表,也可以从数据库查询出来要屏蔽的IP
        var forbidIpList = options.forbidIpList;
        // 获取客户端的IP
        var clientIp = ctx.request.ip;
        // 判断客户端的IP是否在屏弊的IP列表里
        var hasIp = forbidIpList.some(function (val) {
            if (val == clientIp) {
                return true;
            }
        })
        // 如果当前用户的IP已经被屏蔽
        if (hasIp) {
            // 屏蔽
            ctx.status = 403;
            ctx.body = '您的IP已经被屏蔽';
        } else {
            await next();
        }
    }
};

为了便于演示,上面的屏蔽IP列表是在配置文件传的参数过来获取的,实际的项目中,屏蔽IP列表都是从数据据获取的。

完成上面的操作后,访问 127.0.0.1:7001 就会显示当前IP已经被屏蔽,而访问 localhost:7001,则可以正常访问。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/03/24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档