【问题标题】:Delete Cookies on Logout, Laravel 8.x, Fortify/Jetstream注销时删除 Cookie、Laravel 8.x、Fortify/Jetstream
【发布时间】:2021-10-10 01:14:44
【问题描述】:

寻找一种方法来执行一些代码,特别是在从使用 Fortify 和 JetStream 的 Laravel 8.x 框架注销时删除/过期一些 cookie。

我注意到有几篇帖子引用了相同的问题,但不太确定哪个最好以及如何实施。

这个:Laravel Fortify Logout Redirect 看起来很有希望:

那里的第二个选项说:

创建一个新的 LogoutResponse 类并将您的重定向逻辑实现到 toResponse 方法中:

app/Http/Responses/LogoutResponse.php

<?php

namespace App\Http\Responses;

use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Laravel\Fortify\Contracts\LogoutResponse as LogoutResponseContract;
use Symfony\Component\HttpFoundation\Response;

class LogoutResponse implements LogoutResponseContract
{
    /**
     * Create an HTTP response that represents the object.
     *
     * @param Request $request
     *
     * @return Response
     */
    public function toResponse($request)
    {
        return $request->wantsJson()
            ? new JsonResponse('', 204)
            : redirect('www.example.com');
    }
}

现在您可以在 FortifyServiceProvider 的 boot 方法中将新响应绑定到服务容器中:

app/Providers/FortifyServiceProvider.php

public function boot()
{
    $this->app->singleton(
        \Laravel\Fortify\Contracts\LogoutResponse::class,
        \App\Http\Responses\LogoutResponse::class
    );
}

另见:Laravel Fortify

似乎只是做一个重定向相当多,但在我的情况下,我实际上想使一组 cookie 过期,并可能在 app/Http/Responses/LogoutResponse.php 中做更多的内务处理。

也不确定如何在 Laravel 中删除 cookie,?在某些情况下,用户可能实际上甚至没有登录,我可能想在他们关闭浏览器时删除一个 cookie(也许通过使用 JS 来检测关闭浏览器然后删除 Cookie(后端只有 HTTP cookie?)。

$cookie = \Cookie::forget('cookie_name');

【问题讨论】:

    标签: php laravel cookies laravel-fortify


    【解决方案1】:

    根据我的原始帖子,这似乎可行,尽管 LogoutResponse 与我最初发布的内容略有不同,因为它是此处 GitHub 上内容的修改版本:

    fortify/src/Http/Responses/LogoutResponse.php

    <?php
    
    namespace App\Http\Responses;
    
    use Illuminate\Http\JsonResponse;
    use Illuminate\Http\Response;
    use Laravel\Fortify\Contracts\LogoutResponse as LogoutResponseContract;
    
    class LogoutResponse implements LogoutResponseContract
    {
        /**
         * Create an HTTP response that represents the object.
         *
         * @param  \Illuminate\Http\Request  $request
         * @return \Symfony\Component\HttpFoundation\Response
         */
    
        // Added this & also code in App\Providers\FortifyServiceProvider.php to handle the deletion of the JWTVIEWER COOKIE.
    
        public function toResponse($request)
        {
            \Cookie::queue(\Cookie::forget('JWTVIEWER'));
            return $request->wantsJson()
                        ? new JsonResponse('', 204)
                        : redirect('/');
        }
    }
    

    命名空间不同,我添加了一些代码来删除我想在注销时过期的 cookie。代码与 FortifyServiceProvider.php 相同。

    // Override the native LogoutResponse with one created in Responses.
    $this->app->singleton(
    
        \Laravel\Fortify\Contracts\LogoutResponse::class,
        \App\Http\Responses\LogoutResponse::class
    );
    

    如果用户实际主动注销,这似乎可行。我也很乐意捕捉用户关闭浏览器或选项卡而不注销,但这需要 JS 并且有点问题。

    例如Detect browser or tab closing

    【讨论】:

      猜你喜欢
      • 2021-01-13
      • 1970-01-01
      • 2021-06-15
      • 2012-10-01
      • 2021-04-13
      • 2021-08-27
      • 2016-06-03
      • 1970-01-01
      • 2019-03-16
      相关资源
      最近更新 更多