首页 > 解决方案 > laravel 上的“白名单”IP 有问题。也许我对中间件的路由有问题,或者我对解决问题有错误的方式?

问题描述

我在中间件的书面路线上遇到了麻烦。那里没有任何工作。如果使用另一个 IP 我的任务 - 白名单,我仍然可以看到页面。当我访问没有访问 IP 的资源时,它将在另一个页面上路由。我使用中间件

<?php

namespace App\Http\Middleware;

use Closure;

class FilterIps
{
    const ALLOWED = [
        '1.1.1.1',
    ];

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        abort_unless(in_array($request->ip(), self::ALLOWED), 403);
        
        return $next($request);
    }
}

添加到内核文件:

protected $middlewareGroups = [
    'web' => [
        FilterIps::class,
    ],
];

我在网上的路线。也许他不正确?或者我的任务可能没有正确的解决方案?

Route::group(['middleware' => 'web'], function () {     
    Route::get('/demo/loginjs', function () {
        return view('auth.login');
    });
});

标签: laravelroutesipmiddlewarewhitelist

解决方案


如果你想这样使用它

Route::group(['middleware' => 'web'], function () {

您需要将中间件添加到protected $routeMiddleware

protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    //...
    'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,

    'filter' => \App\Http\Middleware\FilterIps::class,
];

那么你可以使用它

Route::group(['middleware' => 'filter'], function () {     
    Route::get('/demo/loginjs', function () {
        return view('auth.login');
    });
});

如果您希望它出现在 中的所有路由上web.php,请将其添加到 web 组而不调用它web.php,它将应用于它们。

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        //...
        \Illuminate\Routing\Middleware\SubstituteBindings::class,

        \App\Http\Middleware\FilterIps::class,
    ],

    'api' => [
        'throttle:60,1',
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],
];

如果您想知道为什么不需要将其添加到web.php文件中,答案就在\App\Providers\RouteServiceProvider::class

protected function mapWebRoutes()
{
    Route::middleware('web')
        ->namespace('App\Http\Controllers')
        ->group(base_path('routes/web.php'));
}

推荐阅读