【问题标题】:Laravel logoutOtherDevices with FortifyLaravel logoutOtherDevices with Fortify
【发布时间】:2020-11-25 20:33:24
【问题描述】:

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

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

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

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

谢谢。

【问题讨论】:

  • 能否请您提供解决方案,您是如何设法使其工作的? TY
  • @AlexanderPop 我已将其添加为答案,因为这是目前唯一的方法。请看一看。希望它会有所帮助。

标签: php laravel laravel-fortify


【解决方案1】:

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

如果您查看与 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);
    }
}

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

【讨论】:

  • 看我上面的回答
  • 我收到错误:“给定的密码与当前密码不匹配”......即使密码没问题
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2016-03-12
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 2021-11-04
    • 2021-01-10
    • 2021-01-13
    相关资源
    最近更新 更多