【问题标题】:Laravel 8 Manually Authenticating Users does not persist the sessionLaravel 8 Manually Authenticating Users 不会持久化会话
【发布时间】:2021-04-29 10:13:13
【问题描述】:

我想以一种简单的方式手动对用户进行身份验证,但我无法在路由之间保持会话。

我用 Laravel 微风 全新安装了 Laravel 8,配置微风后我可以创建用户并通过微风登录与用户登录屏幕,但如果我尝试手动为用户创建会话(跳过用户通过检查),则会话不会持久

要测试:我首先进入 /manual 用户经过身份验证的位置,然后检查路由 /tes 上的会话。但是浏览器中没有注册会话/cookie!!!

这是路由器

  Route::get('/test', [TestController::class, 'testSession']);
  Route::get('/manual', [TestController::class, 'manualLogin']);

这是控制器

 class TestController extends Controller
 {

    public function testSession(Request $request)
    {
        dump(Auth::user());
    }

    public function manualLogin(Request $request)
    {
        $user = User::where('id', 3)->first();
        Auth::login($user, true);
        dump(Auth::user());
    }

这是带有 web 中间件组的路由:

+----------+---------------------------------+-------------------------------------------------------+--------------+
| Method   | URI                             | Action                                                | Middleware   |
+----------+---------------------------------+----------------------------------------------------------------------+
| GET|HEAD | manual                          | App\Http\Controllers\TestController@manualLogin       | web          |
| GET|HEAD | test                            | App\Http\Controllers\TestController@testSession       | web          |
+----------+---------------------------------+----------------------------------------------------------------------+

这是中间件组app/Http/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,
        ],
    ];

我错过了什么,但是什么?

编辑:添加中间件信息

【问题讨论】:

    标签: php laravel authentication laravel-8


    【解决方案1】:

    您确定会话在您的 http 调用之间保持不变吗?

    如果不是:

    检查您的 storage/ 文件夹是否正确

    确保 SESSION_DRIVER 变量不为空

    尝试在 'encrypt' => false 和 'encrypt' => true 之间切换,

    尝试在 'secure' => env('SESSION_SECURE_COOKIE', false) 和 'secure' => env('SESSION_SECURE_COOKIE', true) 之间切换,

    【讨论】:

    • 我确信会话确实有效,我已经安装了 laravel jetstream,它带有用户注册和登录。事实上,我通过用户注册注册了用户并且我能够登录。这两条路由在 auth:sanctum 的内置身份验证之外
    • 你确定 route route 有中间件 startsession 吗?
    • 是的 Middleware\StartSession 是附加到路由的 web 组的一部分
    【解决方案2】:

    好吧,我发现了问题:一切正常,但由于我转储 $user 以检查结果,会话 cookie 没有传递到浏览器,因为标头已经设置。请参阅 response->send() 调用的 Response->sendHeaders()

        /**
         * Sends HTTP headers.
         *
         * @return $this
         */
        public function sendHeaders()
        {
            // headers have already been sent by the developer
            if (headers_sent()) {
                return $this;
            }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-08
      • 2021-05-03
      • 2016-11-15
      • 2021-05-03
      • 2016-04-04
      • 2019-01-29
      • 2015-05-10
      相关资源
      最近更新 更多