Laravel 使用 Fortify 注销其他设备

Laravel logoutOtherDevices with Fortify

我构建了一个带有 Fortify 身份验证的 Laravel 应用程序。要求当用户登录时,他们应该从所有其他设备上注销。在Laravel文档中提到我可以使用Auth::logoutOtherDevices($password);方法。但不清楚如何将其与 Fortify 一起使用。

我试图在 Fortify::authenticateUsing(function (Request $request) {}) 函数中使用它,但它不起作用,因为它在 [=15= 的 logoutOtherDevices() 方法中检查 User 实例] class.

通过在 Laravel\Fortify\Http\Controllers\AuthenticatedSessionController class 中多挖掘一点,我发现我可以在 app/config/fortify.php 中传入自定义登录管道数组并添加我自己的处理程序来调用那里的 logoutOtherDevices() 方法。

我设法让它以这种方式工作。但是我觉得这种方法有些不对劲,我想看看是否有明显的方法可以做到这一点(我在这里遗漏了什么吗?)

谢谢。

添加我当前的解决方案,希望它能对某人有所帮助。

如果您查看与强化身份验证相关的 classes,您将看到身份验证流经多个处理程序 classes 的管道。虽然没有记录,但您可以自定义此流程并通过覆盖 config/fortify.php 配置文件中的以下内容来添加额外的处理程序。

'pipelines' => [
        'login' => [
            Laravel\Fortify\Actions\AttemptToAuthenticate::class,
            Laravel\Fortify\Actions\PrepareAuthenticatedSession::class,
            App\Actions\Fortify\LogoutOtherDevices::class
        ]
    ]

如果配置文件中不存在此块,则需要添加此块。需要前两个才能使默认身份验证过程正常工作。最后一个:App\Actions\Fortify\LogoutOtherDevices::class 是我的自定义处理程序,您可以在其中添加代码以从其他设备注销用户。

创建 App\Actions\Fortify\LogoutOtherDevices class 如下所示,它将起作用。

<?php

namespace App\Actions\Fortify;

use Illuminate\Support\Facades\Auth;

class LogoutOtherDevices
{
    /**
     * Handle the incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  callable  $next
     * @return mixed
     */
    public function handle($request, $next)
    {
        // logout other devices
        Auth::logoutOtherDevices($request->password);
        return $next($request);
    }
}

这很好用。但这在任何地方都没有记录,所以他们有可能随时改变这种行为。这就是我问这个问题的原因,看看是否有任何其他方法可以做到这一点。

看起来你需要按照他们的文档使用管道。看看https://jetstream.laravel.com/1.x/features/authentication.html#customizing-the-authentication-pipeline

To define your custom pipeline, you may use the Fortify::authenticateThrough method. This method accepts a closure which should return the array of classes to pipe the login request through. Typically, this method should be called from the boot method of your App\Providers\JetstreamServiceProvider class.