【问题标题】:disable CSRF middleware based on environment in Laravel在 Laravel 中根据环境禁用 CSRF 中间件
【发布时间】:2016-09-10 14:45:37
【问题描述】:

在我的应用程序中,我想在我的笔记本电脑上运行时禁用 CSRF APP_ENV=local 和开发中 APP_ENV=dev。在 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');
    });

});

我可以使用一些 env 文件加载魔法来确保应用程序加载 .local.ev, .dev.env, .test.env, .production.env 中的任何一个,但我仍然必须找到一种方法来确保 Web 中间件仅在不在本地或开发时才包含 CSRF

【问题讨论】:

    标签: php laravel laravel-5 laravel-5.2 laravel-routing


    【解决方案1】:

    最简单的方法是直接在中间件中禁用 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']) { 行上给出了解析错误
    • 在 5.6 中你似乎不再需要这个了。我不知道他们是如何修复的,或者似乎没有应用程序环境黑客攻击的地方,但他们做到了
    • 只是提醒其他人。你永远不应该在你的 Laravel 应用程序中调用 env(),除非是在缓存的配置文件中。而是调用app()->environment() 来获取环境。
    【解决方案2】:

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

    class ExampleTest extends TestCase {
        use WithoutMiddleware;
        ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-15
      • 2016-05-21
      • 1970-01-01
      • 2015-09-27
      • 1970-01-01
      • 2020-03-27
      相关资源
      最近更新 更多