Laravel 8 API针对特定IP绕过auth:api中间件并自动登录指定用户
实现特定IP自动登录绕过API认证的方案
步骤1:创建自定义中间件
首先生成处理IP判断和自动登录的中间件:
php artisan make:middleware AutoLoginByIp
步骤2:编写中间件逻辑
打开app/Http/Middleware/AutoLoginByIp.php,替换为以下代码:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Support\Facades\Auth; use App\Models\User; class AutoLoginByIp { public function handle($request, Closure $next) { // 配置允许自动登录的IP和目标用户ID $allowedIp = '192.168.1.100'; // 替换为你的目标IP $targetUserId = 1; // 替换为需要自动登录的用户ID // 获取客户端真实IP(反向代理环境需额外配置,见下文) $clientIp = $request->ip(); if ($clientIp === $allowedIp) { $user = User::find($targetUserId); if ($user) { // 使用API guard登录指定用户,让后续auth:api中间件认为已认证 Auth::guard('api')->login($user); } } return $next($request); } }
如果需要支持多个IP,把$allowedIp改成数组,用in_array判断:
$allowedIps = ['192.168.1.100', '10.0.0.5']; if (in_array($clientIp, $allowedIps)) { // 执行登录逻辑 }
步骤3:注册中间件
打开app/Http/Kernel.php,在$routeMiddleware数组中添加新中间件:
protected $routeMiddleware = [ // ... 其他已存在的中间件 'auto.login.by.ip' => \App\Http\Middleware\AutoLoginByIp::class, ];
步骤4:调整路由中间件顺序
把自定义中间件放在auth:api前面,确保自动登录逻辑先执行:
Route::group(['middleware' => ['auto.login.by.ip', 'auth:api', 'StripScript'], 'prefix' => 'v1'], function(){ Route::get('/list', [ListController::class, 'list']); });
反向代理环境的IP获取说明
如果你的服务器使用了Nginx、Apache等反向代理,需要配置Laravel信任代理,才能拿到真实客户端IP:
- 打开
app/Http/Middleware/TrustProxies.php,修改$proxies为你的代理IP,或者设置为'*'(生产环境不建议用*,需指定具体代理IP):
protected $proxies = '*';
- 或者在
.env文件中添加:
TRUST_PROXIES=*
这样当指定IP的请求进来时,中间件会自动登录指定用户,后续的auth:api中间件会检测到已认证的用户,从而绕过token验证。
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

