Laravel 7 会话存储未按要求设置

Posted

技术标签:

【中文标题】Laravel 7 会话存储未按要求设置【英文标题】:Laravel 7 Session store not set on request 【发布时间】:2020-08-24 17:13:57 【问题描述】:

我正在尝试使用第三方身份验证 API 进行 自定义身份验证,这意味着我在另一个项目(Lumen 项目)中有一个登录端点。我找到了一个关于如何做到这一点的教程,但在 here 上使用 Laravel 5.2

我正在使用:

Laravel 7 phpRedis/Redis

错误:

RuntimeException: 会话存储未按请求设置。

教程有点简单。步骤如下:

    安装 PhpRedis 和 Guzzle。 创建包含Throttles.php 的自定义身份验证控制器,其中适用于缓存。 覆盖 Laravel 的身份验证中间件 (Authenticate.php)。

我已完成所有步骤,并且没有遗漏任何内容。我试图解决这个问题,但它们都不起作用:

    我在登录路由中使用了web 中间件,但它不起作用,我不知道为什么

    Route::group(['middleware' => ['web']], function () 
        Route::get('login', 'Auth\CustomAuthController@showLoginForm');
        Route::post('login', 'Auth\CustomAuthController@login');
        Route::get('logout', 'Auth\CustomAuthController@logout');
    );
    

默认情况下,您可以在这里看到我的Kernel.php

protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            // \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
    配置缓存驱动

我的.env 文件

BROADCAST_DRIVER=log
CACHE_DRIVER=redis
QUEUE_CONNECTION=sync
SESSION_DRIVER=redis
SESSION_LIFETIME=120

我的database.php

'redis' => [

        'client' => env('REDIS_CLIENT', 'predis'),

        'options' => [
            'cluster' => env('REDIS_CLUSTER', 'redis'),
            'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
        ],

        'default' => [
            'host' => env('REDIS_HOST', 'localhost'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', 6379),
            'database' => 0,
            'read_write_timeout' => 60,
        ],

        'cache' => [
            'url' => env('REDIS_URL'),
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', '6379'),
            'database' => env('REDIS_CACHE_DB', '1'),
        ],

        'session' => [
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', 6379),
            'database' => 1,
        ],

    ],

还有我的session.php

'connection' => 'session',

我已经尝试了所有这些,但都没有奏效。我不知道发生了什么,也许 Laravel 7 需要别的东西,或者我错过了一些东西。只是有人知道为什么web 中间件不起作用?

【问题讨论】:

【参考方案1】:

弗洛尔,

我面临着完全相同的问题。通过进行以下更改使其正常工作 AuthenticationRequest.php

类 AuthenticationRequest 扩展请求

类 AuthenticationRequest 扩展 FormRequest

您还需要以下导入

使用 Illuminate\Foundation\Http\FormRequest;

【讨论】:

我猜在较新版本的 laravel 中,当我们使用以下命令 php artisan make:request someSampleRequest 创建新请求时,它会使用 FormRequest 依赖项。

以上是关于Laravel 7 会话存储未按要求设置的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 8 Sanctum SPA Auth - 未按要求设置会话存储

php artisan route:list RuntimeException 会话存储未按请求设置

通过中间件方法访问Laravel会话 - 会话存储未根据请求设置

PHP Laravel:如何设置或获取会话数据?

会话不在 Vue.js 和 Laravel 中存储数据

Laravel 如何在会话 Laravel 中存储额外的数据/值