在thinkphp5.1中实现接口黑名单拦截需通过中间件在请求到达控制器前校验ip、token或路径是否匹配黑名单,支持配置文件或redis存储、多级路由绑定及通配符匹配、动态管理与日志告警等增强功能。

在 ThinkPHP5.1 中实现接口黑名单拦截,核心是利用中间件(Middleware)在请求到达控制器前进行统一校验,检查客户端 IP、Token、请求路径或自定义标识是否在黑名单中。关键在于拦截时机早、判断逻辑清晰、不影响正常业务流程。
一、创建黑名单中间件
使用命令行快速生成中间件:
php think make:middleware BlacklistCheck编辑 app/middleware/BlacklistCheck.php,实现基础拦截逻辑:
- 从配置或数据库读取黑名单数据(如 IP 列表、非法 token 前缀、禁用的 API 路径)
- 获取当前请求的客户端 IP:
$request->ip() - 获取请求路径:
$request->url(true)或$request->path() - 获取 Header 中的 Token(如 Bearer):
$request->header('authorization') - 若匹配任一黑名单项,直接返回 JSON 错误响应并中断后续执行
二、配置黑名单数据源
推荐将黑名单规则存于配置文件(便于热更新)或缓存(提升性能):
- 在 config/blacklist.php 中定义:
'ips' => ['192.168.1.100', '222.33.44.55'],
'tokens' => ['abc123', 'xyz789'],
'paths' => ['/api/v1/user/delete', '/admin/login']
];
在中间件中通过 config('blacklist.ips') 读取;高频访问场景建议用 Redis 缓存黑名单集合,用 $redis->sIsMember('blacklist:ip', $ip) 快速判断。
三、注册中间件并绑定路由
在 route/app.php 中按需绑定:
- 全局应用(所有 API):
Route::rule('','index/Index/index')->middleware(BlacklistCheck::class); - 分组应用(仅 API 组):
Route::group('api', function () { /* 路由定义 */ })->middleware(BlacklistCheck::class); - 单个路由应用:
Route::get('user/info', 'api.User/info')->middleware(BlacklistCheck::class);
确保中间件在 CORS、Auth 等中间件之前执行,避免被绕过。
四、增强实用性细节
实际项目中可补充以下能力提升鲁棒性:
-
支持通配符路径匹配:如
/api/v1/*或/admin/.*,用fnmatch()或正则判断 - 动态黑名单管理:提供后台接口(如 POST /api/admin/blacklist/add)实时增删,操作后刷新缓存
- 日志记录与告警:对每次拦截写入日志(含时间、IP、路径、原因),异常频次高时触发邮件/钉钉通知
- 白名单豁免:内网 IP 或运维账号可跳过检查,避免误封自身调试流量
不复杂但容易忽略。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











