【问题标题】:How to automatically logout multiple devices with Laravel如何使用 Laravel 自动注销多个设备
【发布时间】:2022-08-15 02:04:05
【问题描述】:

我正在使用 Laravel 9,如果他们尝试通过多个设备登录,我想自动注销用户(不刷新)。 我正在使用以下代码(在登录控制器.php) 并且它可以工作,但用户需要刷新才能退出:

protected function authenticated()
    {
        Auth::logoutOtherDevices(request(\'password\'));
    }

有没有办法在多次登录时自动注销用户(不刷新)? ..我在想阿贾克斯?事件? .

谢谢

  • 如果您使用任何实时通信,则可以通过它发送事件。否则,您可以设置一个计时器以在页面空闲一段时间后自动刷新页面。
  • 该页面是视频播放列表(有课程),我认为刷新它不是一个好主意..而且我只使用带有引导程序的 laravel(不是 vue 或反应或惯性)..
  • 然后我认为您可以使用套接字,检查登录状态并通过套接字发送事件。它会使用更少的带宽。
  • 你能和我分享一个链接(教程/文章)吗?
  • 您可以创建一个客户端函数来发布请求以每 60 秒处理一次身份验证检查。如果身份验证失败,则刷新页面(应显示已注销)。

标签: php laravel authentication logout


【解决方案1】:

您必须使用 websockets 来执行此操作。您可以为此使用 Laravel Echo,并创建一个名为 RefreshBrowser 的广播事件。

然后在您的 Javascript 中,您将侦听该事件并在调用该事件时通过 JS 触发浏览器刷新。

【讨论】:

  • 你不必这样做。没有理由不能对setTimeout 循环进行简单的Ajax 检查。
  • @miken32 向每个用户添加客户端 AJAX 请求轮询以查找可能很少发生的事情是一个坏主意。
  • @kjoedion 为什么使用 AJAX 是个坏主意?你能分享一个关于在 laravel 中使用 websockets 的链接或教程吗?
  • @miken32 谢谢,这就是我的想法.. 但是向什么发送请求?第几页?
  • @php_man 随便你。制作一条不返回正文的专用路线。您只需要获取状态 200 或 401。
【解决方案2】:

如果您已经在此站点上设置了 websockets 基础设施,那么我同意这是最简单的方法。否则对于这样一个简单的任务来说它是矫枉过正的。

设置这样的路线:

Route::get("/auth/check", fn () => Auth::check ? response("ok") : response("fail", 401))->name("auth.check");

如果用户未通过身份验证,这将返回 401 错误代码。

然后在客户端(我假设您在这里使用 Blade 模板)执行以下操作:

const authCheck = function() {
    $.ajax({
        url: @json(route("auth.check")),
        success: function() {
            setTimeout(authCheck, 60000);
        },
        error: function() {
            window.location.href = @json(route("login"));
        }
    });
}

authCheck();

这只是定义了一个调用新路由的函数。如果成功,它将在 60 秒内再次尝试。如果失败,它会重定向到可能是您的登录页面。

不,如果客户端启用了 Javascript,它将无法工作; websockets也不会。如果你想在客户端工作,你就要听从客户端的摆布。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    • 1970-01-01
    • 2016-04-03
    • 2017-09-30
    • 2017-10-03
    • 1970-01-01
    • 2015-06-03
    相关资源
    最近更新 更多