在Laravel中根据环境禁用CSRF中间件

5

在我的应用程序中,我想在运行于我的笔记本电脑(APP_ENV=local)和开发环境(APP_ENV=dev)时禁用CSRF。但我不知道如何在routes.php或Web中间件中实现。以下是我的routes.php文件:

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

    Route::get('/', function () {
        return view('welcome');
    })->middleware('guest');

    Route::group(['middleware' => 'auth'], function()
    {
        Route::resource('battles', 'BattlesController'); //, ['except' => ['index']]);
        Route::resource('disputes', 'DisputesController');
        Route::resource('messages', 'MessagesController');
    });

});

我希望能有一些环境文件加载的魔法,以确保应用程序加载以下任一文件:.local.ev、.dev.env、.test.env、.production.env,但我仍然需要找到一种方法,以确保Web中间件仅在不处于本地或开发环境时包含CSRF。

2个回答

10

最简单的方法是直接在中间件中禁用CSRF检查。为了做到这一点,您需要修改 App\Http\Middleware\VerifyCsrfToken 类。在那里添加以下 handle() 方法:

public function handle($request, \Closure $next)
{
    if (in_array(env('APP_ENV'), ['local', 'dev'])) {
        return $next($request);
    }

    return parent::handle($request, $next);
}

看起来是个好主意,但在 if (in_array(env('APP_ENV'), ['local', 'dev']) { 这一行上会出现解析错误。 - Anadi Misra
在5.6中,你似乎不再需要这个了。我不知道他们是如何修复的,或者在哪里进行修复,因为似乎没有应用程序环境黑客,但他们确实做到了。 - MrMesees
1
提醒大家一下,除了在缓存的配置文件中,你不应该在 Laravel 应用程序内部调用 env()。相反,应该调用 app()->environment() 来获取环境。 - Trevor Gehman

1

我曾经遇到过类似的问题,与测试环境有关,可以通过关闭中间件来解决:

class ExampleTest extends TestCase {
    use WithoutMiddleware;
    ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接