Laravel 身份验证过滤器在生产服务器上失败

Posted

技术标签:

【中文标题】Laravel 身份验证过滤器在生产服务器上失败【英文标题】:Laravel auth filter fails on production server 【发布时间】:2015-03-01 15:27:45 【问题描述】:

我正在使用具有标准内置身份验证支持的 Laravel 4 框架。在本地环境中一切正常(MAMP、OSx),但在我的生产服务器(带有 Ubuntu、Apache、php 5.5.9 的 Digital Ocean 标准映像)上,身份验证过滤器失败并允许未经身份验证的访问。

routes.php:

Route::group(['before'=>'auth'], function()
    Route::get('admin', array('uses' => 'AdminController@home'));
    Route::get('admin/dashboard', function()
        return Redirect::to('admin');
    );

    Route::post('payment/ok', array('uses' => 'PaymentController@ok'));
    Route::post('payment/fail', array('uses' => 'PaymentController@fail'));
    Route::get('admin/makeDMS/id', array('uses' => 'PaymentController@makeDMStransaction'));
    Route::get('admin/products', array('uses' => 'AdminController@products'));
    Route::get('admin/product/id', array('uses' => 'AdminController@product'));
    Route::get('admin/orders', array('uses' => 'AdminController@orders'));
    Route::get('admin/order/id', array('uses' => 'AdminController@order'));
    Route::post('admin/setOrderStatus', array('uses' => 'AdminController@setOrderStatus'));
    Route::post('admin/updateProduct', array('uses' => 'AdminController@updateProduct'));
    Route::get('admin/transactions', array('uses' => 'AdminController@transactions'));  
);

filters.php:

Route::filter('auth', function()

    if (Auth::guest())
    
        if (Request::ajax())
        
            return Response::make('Unauthorized', 401);
        
        else
        
            return Redirect::guest('login');
        
    
);


Route::filter('auth.basic', function()

    return Auth::basic();
);

Route::filter('guest', function()

    if (Auth::check()) return Redirect::to('/');
);

我尝试使用Route::group 和控制器构造函数来保护所需的路由,但输出是相同的:使用良好凭据登录有效,使用错误凭据的用户无法登录,但应该保护的路由组可用对于未经身份验证的用户。

我发现快速 CGI 模式下的 php 会产生这种行为,但这是我的sudo apachectl -M 输出:

Loaded Modules:
 core_module (static)
 so_module (static)
 watchdog_module (static)
 http_module (static)
 log_config_module (static)
 logio_module (static)
 version_module (static)
 unixd_module (static)
 access_compat_module (shared)
 alias_module (shared)
 auth_basic_module (shared)
 authn_core_module (shared)
 authn_file_module (shared)
 authz_core_module (shared)
 authz_host_module (shared)
 authz_user_module (shared)
 autoindex_module (shared)
 deflate_module (shared)
 dir_module (shared)
 env_module (shared)
 filter_module (shared)
 mime_module (shared)
 mpm_prefork_module (shared)
 negotiation_module (shared)
 php5_module (shared)
 rewrite_module (shared)
 setenvif_module (shared)
 status_module (shared)

【问题讨论】:

【参考方案1】:

好的,我找到了解决方案。与往常一样,RTM...

我的环境设置为“测试”,这是为单元测试保留的,manual 很好地说:

注意:在测试环境中,路由过滤器被禁用。到 启用它们,将 Route::enableFilters() 添加到您的测试中。

我将环境变量更改为“生产”,现在一切正常。

【讨论】:

以上是关于Laravel 身份验证过滤器在生产服务器上失败的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Passport JWT 身份验证失败

使用Symfony框架在生产服务器上登录失败(由于...无法处理身份验证请求)

ASP.NET Core Azure AD OpenID - 生产服务器上的令牌签名验证失败

laravel 跨域身份验证 cookie 和过滤器

Firebase 电话身份验证在已投入生产的应用程序上失败,状态码为 17028

使用 Laravel Echo 加入频道时,如何判断身份验证失败?