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

2020-11-26 12:49:48 浏览数 (1)

中间件是在匹配路由前、匹配路由后做的一系列的操作,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,则可以正常访问。

0 人点赞