You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Laravel中如何基于IP限制管理员登录页访问?仅允许单个IP

嘿,这个需求在Laravel里用中间件就能完美解决,而且后续要改IP也很方便。我给你一步步说具体怎么实现:

1. 创建自定义IP限制中间件

首先我们需要生成一个专门处理IP限制的中间件,在终端运行这个Artisan命令:

php artisan make:middleware RestrictAdminLoginByIp

这个命令会在app/Http/Middleware目录下生成一个新的中间件文件。

2. 编写IP限制逻辑

打开刚生成的RestrictAdminLoginByIp.php文件,修改handle方法,加入IP判断逻辑:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class RestrictAdminLoginByIp
{
    public function handle(Request $request, Closure $next): Response
    {
        // 推荐把允许的IP放到配置文件里,方便后续修改
        // 你可以在config/app.php里加一行:'allowed_admin_ip' => '192.168.1.100',
        $allowedIp = config('app.allowed_admin_ip');

        // 也可以直接写死IP,比如$allowedIp = '192.168.1.100';

        // 对比请求IP和允许的IP,不匹配就返回403禁止访问
        if ($request->ip() !== $allowedIp) {
            abort(403, '抱歉,你的IP没有权限访问此页面');
        }

        return $next($request);
    }
}

这里要注意:如果你的服务器用了反向代理(比如Nginx、Cloudflare),$request->ip()可能拿到的是代理服务器的IP,这时候需要在app/Http/Middleware/TrustProxies.php里配置信任的代理IP段,确保Laravel能获取到用户的真实IP。

3. 注册中间件

接下来要把这个中间件注册成路由中间件,这样才能在路由上使用。打开app/Http/Kernel.php,找到$routeMiddleware数组,添加一行:

protected $routeMiddleware = [
    // 其他中间件...
    'admin.ip.restrict' => \App\Http\Middleware\RestrictAdminLoginByIp::class,
];
4. 给管理员登录路由绑定中间件

最后一步就是把这个中间件应用到管理员的登录路由上。

如果你用的是Laravel自带的认证路由,可以这样修改routes/web.php

// 先禁用默认注册路由(如果不需要的话)
Auth::routes(['register' => false]);

// 把登录路由放到中间件组里,限制IP访问
Route::middleware('admin.ip.restrict')->group(function () {
    Route::get('/login', [App\Http\Controllers\Auth\LoginController::class, 'showLoginForm'])->name('login');
    Route::post('/login', [App\Http\Controllers\Auth\LoginController::class, 'login']);
});

如果是自定义的管理员登录路由(比如/admin/login),直接给路由加上中间件即可:

use App\Http\Controllers\Admin\AuthController;

Route::get('/admin/login', [AuthController::class, 'showLoginForm'])
    ->middleware('admin.ip.restrict')
    ->name('admin.login');

Route::post('/admin/login', [AuthController::class, 'login'])
    ->middleware('admin.ip.restrict');

这样设置之后,只有你指定的那个IP才能访问管理员登录页面,其他IP都会收到403禁止访问的响应。

内容的提问来源于stack exchange,提问作者Denna Scott

火山引擎 最新活动