0

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

我试图在Fortify::authenticateUsing(function (Request $request) {})函数中使用它,但它不起作用,因为它检查类中方法 User内的实例。logoutOtherDevices()Illuminate\Auth\SessionGuard

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

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

谢谢。

4

2 回答 2

4

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

如果您查看与 fortify 身份验证相关的类,您将看到身份验证流经多个处理程序类的管道。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类,它将起作用。

<?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);
    }
}

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

于 2021-01-12T08:22:37.053 回答
1

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

要定义您的自定义管道,您可以使用 Fortify::authenticateThrough 方法。此方法接受一个闭包,该闭包应返回类数组以通过管道传输登录请求。通常,应从 App\Providers\JetstreamServiceProvider 类的引导方法调用此方法。

于 2021-01-13T20:01:43.267 回答