Laravel Socialite单点登录:强制多设备登出实现教程

Laravel Socialite单点登录:强制多设备登出实现教程

本文旨在提供一个在laravel socialite应用中实现单用户会话、强制多设备登出的专业教程。通过引入设备标识符、优化登录流程以及创建会话验证中间件,确保用户在任何时刻只能在一个设备上保持登录状态,从而提升应用的安全性和用户会话管理能力。

在现代Web应用中,尤其是在使用第三方认证(如Google、Twitter通过Laravel Socialite)的场景下,为了增强账户安全性并确保会话管理的严谨性,常常需要限制用户只能在一个设备上保持登录状态。当用户从新设备登录时,其在旧设备上的会话应自动失效。本教程将详细阐述如何通过数据库字段、会话管理和自定义中间件来实现这一目标。

1. 数据库结构调整:引入设备标识符

首先,我们需要在 users 表中添加一个字段来存储当前用户登录设备的唯一标识符。这个标识符将在用户每次成功登录时更新。

创建迁移文件:

php artisan make:migration add_device_identifier_to_users_table --table=users

编辑迁移文件:

string('current_device_identifier')->nullable()->after('remember_token');        });    }    /**     * Reverse the migrations.     *     * @return void     */    public function down()    {        Schema::table('users', function (Blueprint $table) {            $table->dropColumn('current_device_identifier');        });    }}

运行迁移:

php artisan migrate

current_device_identifier 字段将用于存储用户当前活跃会话的设备标识。

2. 登录流程优化:生成并存储设备标识

在用户通过Laravel Socialite成功认证并登录后,我们需要生成一个唯一的设备标识符,将其存储到 users 表中,并同时将其写入到当前用户的会话(或JWT令牌)中。

生成设备标识符的策略:

设备标识符可以是一个简单的UUID,也可以是基于用户代理(User-Agent)和IP地址的哈希值,以提供更强的设备关联性。为了简化,这里我们使用一个随机字符串。

修改 Socialite 回调逻辑:

假设您的 Socialite 回调逻辑位于 AuthController 或类似的控制器中。

redirect();    }    /**     * Obtain the user information from the social provider.     *     * @param string $provider     * @return IlluminateHttpRedirectResponse     */    public function handleProviderCallback($provider)    {        try {            $socialUser = Socialite::driver($provider)->user();        } catch (Exception $e) {            return redirect('/login')->withErrors(['social_login' => '无法通过 ' . ucfirst($provider) . ' 登录,请重试。']);        }        $user = User::where('provider_id', $socialUser->getId())                    ->where('provider', $provider)                    ->first();        if (!$user) {            // 如果用户不存在,则创建新用户            $user = User::create([                'name' => $socialUser->getName(),                'email' => $socialUser->getEmail(),                'provider' => $provider,                'provider_id' => $socialUser->getId(),                // ... 其他字段            ]);        }        // 生成新的设备标识符        $deviceIdentifier = Str::random(60);        // 更新用户表中的设备标识符        $user->update([            'current_device_identifier' => $deviceIdentifier,        ]);        // 登录用户        Auth::login($user, true);        // 将设备标识符存储到当前会话中        session(['device_identifier' => $deviceIdentifier]);        return redirect()->intended('/home');    }    /**     * Log the user out of the application.     *     * @return IlluminateHttpRedirectResponse     */    public function logout()    {        Auth::logout();        session()->forget('device_identifier'); // 清除会话中的设备标识符        request()->session()->invalidate();        request()->session()->regenerateToken();        return redirect('/');    }}

在上述代码中:

我们生成了一个随机字符串作为 deviceIdentifier。将此标识符更新到 users 表的 current_device_identifier 字段中。在用户登录成功后,将相同的 deviceIdentifier 存储到当前用户的会话 (session) 中。

3. 创建并应用会话验证中间件

现在,我们需要一个中间件来在每次请求时验证当前会话中的 device_identifier 是否与数据库中存储的 current_device_identifier 匹配。如果不匹配,则意味着用户已从其他设备登录,当前会话应被强制登出。

创建中间件:

php artisan make:middleware EnsureSingleSession

编辑 app/Http/Middleware/EnsureSingleSession.php:

current_device_identifier) || $user->current_device_identifier !== $sessionDeviceIdentifier) {                Auth::logout(); // 强制登出当前用户                $request->session()->invalidate(); // 使会话失效                $request->session()->regenerateToken(); // 重新生成CSRF令牌                // 可以重定向到登录页并附带提示信息                return redirect('/login')->withErrors(['session_expired' => '您已从其他设备登录,当前会话已失效。请重新登录。']);            }        }        return $next($request);    }}

注册中间件:

打开 app/Http/Kernel.php 文件,将 EnsureSingleSession 中间件添加到 web 中间件组中,确保它在所有需要保护的Web路由上运行。

protected array $middlewareGroups = [    'web' => [        AppHttpMiddlewareEncryptCookies::class,        IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class,        IlluminateSessionMiddlewareStartSession::class,        // IlluminateSessionMiddlewareAuthenticateSession::class, // 如果使用,确保在自定义中间件之前        IlluminateViewMiddlewareShareErrorsFromSession::class,        AppHttpMiddlewareVerifyCsrfToken::class,        IlluminateRoutingMiddlewareSubstituteBindings::class,        AppHttpMiddlewareEnsureSingleSession::class, // 添加到这里    ],    'api' => [        // LaravelSanctumHttpMiddlewareEnsureFrontendRequestsAreStateful::class,        'throttle:api',        IlluminateRoutingMiddlewareSubstituteBindings::class,    ],];

将中间件添加到 web 组后,所有使用 web 路由中间件的路由都将受到此单会话验证的保护。

注意事项

设备标识符的生成策略: 上述示例使用了简单的随机字符串。在生产环境中,您可以考虑使用更复杂的策略,例如结合 request()->header(‘User-Agent’) 和 request()->ip() 的哈希值,以更好地识别“设备”。然而,请注意IP地址和User-Agent的变动性(如移动网络IP切换、浏览器更新User-Agent)。UUID或加密的随机字符串通常是更可靠的选择。用户体验: 突然的登出可能会让用户感到困惑。可以在重定向到登录页时提供清晰的提示信息,解释登出的原因。API认证(JWT/Sanctum): 如果您的应用还使用JWT或Laravel Sanctum进行API认证,此逻辑需要进行相应调整。JWT通常是无状态的,但您可以在JWT的Payload中包含 device_identifier,并在每次请求时通过中间件验证该Payload中的标识符是否与数据库中的匹配。会话失效时间: Laravel的会话默认有过期时间。此机制与会话过期机制是互补的,即使会话未过期,如果用户从新设备登录,旧设备也会被强制登出。登出逻辑: 确保在用户主动登出时,也清除会话中的 device_identifier,并根据需要清除数据库中的 current_device_identifier(设置为 null 或更新为新值)。

总结

通过在 users 表中存储设备标识符、在登录时更新此标识符并将其写入会话,以及通过自定义中间件在每次请求时进行验证,我们成功地为Laravel Socialite应用构建了一个强制单用户会话和多设备登出策略。这不仅提升了应用安全性,也为用户提供了更清晰的会话管理体验。这种方法是实现账户安全和会话控制的有效实践。

以上就是Laravel Socialite单点登录:强制多设备登出实现教程的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1339784.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
php源码包怎么设置_php源码包设置解压与部署参数法【教程】
上一篇 2025年12月13日 03:15:22
基于多条件高效更新SQL表:以邮编区域分配销售人员为例
下一篇 2025年12月13日 03:15:40

相关推荐

  • Safari浏览器iCloud标签页不显示怎么办_Safari浏览器iCloud标签页同步问题解决方案

    Safari浏览器iCloud标签页不显示怎么办_Safari浏览器iCloud标签页同步问题解决方案Safari浏览器iCloud标签页不显示怎么办_Safari浏览器iCloud标签页同步问题解决方案Safari浏览器iCloud标签页不显示怎么办_Safari浏览器iCloud标签页同步问题解决方案Safari浏览器iCloud标签页不显示怎么办_Safari浏览器iCloud标签页同步问题解决方案

    首先确认Apple ID登录一致,检查iCloud标签页同步开关是否开启,重启同步服务并验证系统时间与网络连接,尝试重启设备或重新登录Apple ID以解决iCloud标签页不同步问题。 如果您在使用Safari浏览器时发现iCloud标签页未能正确显示或同步,可能是由于账户设置、网络连接或系统配置…

    2026年9月28日 • 用户投稿
    100
  • TikTok私信显示异常怎么办

    TikTok私信显示异常怎么办TikTok私信显示异常怎么办TikTok私信显示异常怎么办TikTok私信显示异常怎么办

    私信异常多因设置、规则或技术问题,需检查互关状态、隐私权限、年龄限制及网络状况,排除违规行为并更新应用,必要时联系官方客服处理。 当TikTok私信显示异常时,可能是由多种原因导致的,包括账号设置、平台规则限制或技术问题。要解决这个问题,需要从多个方面逐一排查和处理。 检查账号设置与互动条件 私信功…

    2026年9月28日 • 用户投稿
    000
  • 豆包 AI 大模型如何和 AI 模型风格设计工具结合设计风格?攻略​

    豆包 AI 大模型如何和 AI 模型风格设计工具结合设计风格?攻略​豆包 AI 大模型如何和 AI 模型风格设计工具结合设计风格?攻略​豆包 AI 大模型如何和 AI 模型风格设计工具结合设计风格?攻略​豆包 AI 大模型如何和 AI 模型风格设计工具结合设计风格?攻略​

    全民k歌:歌房舞台效果开启指南 腾讯出品的全民K歌,以其智能打分、修音、混音和专业音效等功能,深受K歌爱好者喜爱。本教程将详细指导您如何在全民K歌歌房中开启炫酷的舞台效果。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 步骤: 打开全民K歌…

    2026年9月28日 • 用户投稿
    200
  • 抖音的私信关了怎么开启?私信关了对方发信息显示什么?

    抖音的私信关了怎么开启?私信关了对方发信息显示什么?抖音的私信关了怎么开启?私信关了对方发信息显示什么?抖音的私信关了怎么开启?私信关了对方发信息显示什么?抖音的私信关了怎么开启?私信关了对方发信息显示什么?

    抖音的私信功能是用户之间交流的重要工具,但有时可能因设置调整而被关闭。本文将为您详细说明如何重新打开私信权限,并介绍关闭后他人发送消息时会看到哪些提示,助您更好地掌控社交互动与隐私安全。 一、抖音私信关闭了如何重新开启? 若您发现无法收到或发送私信,很可能是私信接收权限被关闭。只需几个简单步骤即可恢…

    2026年9月28日 • 用户投稿
    100
  • edge隐私设置里的跟踪防护怎么选_edge浏览器跟踪防护级别设置详解

    edge隐私设置里的跟踪防护怎么选_edge浏览器跟踪防护级别设置详解edge隐私设置里的跟踪防护怎么选_edge浏览器跟踪防护级别设置详解edge隐私设置里的跟踪防护怎么选_edge浏览器跟踪防护级别设置详解edge隐私设置里的跟踪防护怎么选_edge浏览器跟踪防护级别设置详解

    答案:调整Edge浏览器跟踪防护级别可解决网站加载异常和广告过多问题。首先了解基本、平衡、严格三种模式;接着根据需求选择基本模式以保证兼容性,或启用平衡模式拦截大部分第三方跟踪器,默认推荐;若需更强保护,可开启严格模式,但可能影响部分网站功能;最后针对特定网站通过地址栏盾牌图标自定义防护级别,确保使…

    2026年9月28日 • 用户投稿
    100
  • 解决Java Mail发送iCalendar邀请时的时间区域问题

    解决Java Mail发送iCalendar邀请时的时间区域问题解决Java Mail发送iCalendar邀请时的时间区域问题解决Java Mail发送iCalendar邀请时的时间区域问题解决Java Mail发送iCalendar邀请时的时间区域问题

    本文将围绕在使用Java Mail发送iCalendar会议邀请时,会议时间出现偏差的问题展开,重点讨论如何正确处理时区信息。正如摘要所述,问题的根源在于iCalendar规范对时间格式的严格要求,以及开发者对时区处理的疏忽。下面我们将深入分析原因,并提供详细的解决方案。 理解iCalendar中的…

    2026年9月28日 • 用户投稿
    200
  • Linux ulimit命令详解与使用方法

    ulimit用于限制进程资源,如文件大小、进程数和内存;默认显示文件大小软限制,常用选项包括-f、-n、-u等,软限制可由用户调整,硬限制需root修改;通过ulimit -a查看所有限制,设置如ulimit -n 1024可限制打开文件数;永久配置需编辑/etc/security/limits.c…

    2026年9月28日
    100
  • sublime快捷键大全_Windows与macOS常用快捷键速查表

    sublime快捷键大全_Windows与macOS常用快捷键速查表sublime快捷键大全_Windows与macOS常用快捷键速查表sublime快捷键大全_Windows与macOS常用快捷键速查表sublime快捷键大全_Windows与macOS常用快捷键速查表

    Sublime Text常用快捷键涵盖文件操作如Ctrl+N新建、Ctrl+O打开、Ctrl+S保存;编辑操作如Ctrl+D选词、Ctrl+L选行、Ctrl+Shift+L多行同时编辑;代码导航如Ctrl+P跳转文件、Ctrl+G跳转行、Ctrl+R前往函数;以及查找替换和注释等,熟练掌握可大幅提升…

    2026年9月28日 • 用户投稿
    000
  • Java Mail iCal会议邀请中的时区处理:避免时间偏移的专业指南

    Java Mail iCal会议邀请中的时区处理:避免时间偏移的专业指南Java Mail iCal会议邀请中的时区处理:避免时间偏移的专业指南Java Mail iCal会议邀请中的时区处理:避免时间偏移的专业指南Java Mail iCal会议邀请中的时区处理:避免时间偏移的专业指南

    本教程深入探讨了Java Mail发送iCal会议邀请时常见的时区偏移问题。核心在于iCal DTSTART和DTEND字段对UTC时间(以’Z’结尾)的默认解释。文章将详细阐述如何利用java.time API正确构造本地时间或带有时区标识的时间字符串,从而确保会议邀请在接…

    2026年9月28日 • 用户投稿
    200
  • web服务组件基础入门笔记小结

    web服务组件基础入门笔记小结web服务组件基础入门笔记小结web服务组件基础入门笔记小结web服务组件基础入门笔记小结

    web开发语言包括php、asp.net、jsp等,涵盖了多种用于构建web应用的编程语言。 Web服务系统主要分为Windows和Linux两大类。Windows系统代表有Windows 2003和Windows 2008,常见漏洞包括“永恒之蓝”(MS17-010)和MS08-067(虽然过时但…

    2026年9月28日 • 用户投稿
    000
  • 荣耀手机摄像头如何调整以提升拍摄质量?教你设置高画质的步骤

    答案:荣耀手机拍出高画质照片需善用专业模式与AI功能。清洁镜头后,根据场景选择模式,如夜景、人像或专业模式;在专业模式中调整ISO、快门速度、EV、白平衡和对焦;开启HDR和构图辅助线提升细节与构图;利用AI摄影优化色彩,结合高分辨率与三脚架保持稳定,不同光线下灵活设置参数,实现清晰出彩的拍摄效果。…

    2026年9月28日
    100
  • 用高刷带鱼屏打游戏 Vidda 三色激光投影亮相 AWE2024

    用高刷带鱼屏打游戏 Vidda 三色激光投影亮相 AWE2024用高刷带鱼屏打游戏 Vidda 三色激光投影亮相 AWE2024用高刷带鱼屏打游戏 Vidda 三色激光投影亮相 AWE2024用高刷带鱼屏打游戏 Vidda 三色激光投影亮相 AWE2024

    vidda三色激光投影于2024年3月14日在上海awe中国家电及消费电子博览会再次展示其技术。除了传统的电影观赏体验,vidda三色激光投影还展示了一种新的玩法——通过两台投影仪拼接成超宽屏幕,为高刷新率游戏带来全新的沉浸体验。这种创新的应用方式吸引了众多参观者的目光,展示了投影技术在娱乐领域的无…

    2026年9月28日 • 用户投稿
    100
  • 在线小说阅读平台排名2025-完结小说免费观看网站推荐

    在线小说阅读平台排名2025-完结小说免费观看网站推荐在线小说阅读平台排名2025-完结小说免费观看网站推荐在线小说阅读平台排名2025-完结小说免费观看网站推荐在线小说阅读平台排名2025-完结小说免费观看网站推荐

    起点、番茄、七猫是2025年看完结小说的主流平台,起点书库经典多,番茄免费资源丰富且分类清晰,七猫女频完结作品全,三者均支持免费阅读,适合不同偏好的读者。 想找2025年靠谱的在线小说平台看完结书?免费资源多、体验好的平台其实集中在几家大厂旗下。下面这几个,不仅书库全,完结作品丰富,而且支持直接阅读…

    2026年9月28日 • 用户投稿
    200
  • JNA高级教程:如何高效映射C语言嵌套结构体与联合体

    JNA高级教程:如何高效映射C语言嵌套结构体与联合体JNA高级教程:如何高效映射C语言嵌套结构体与联合体JNA高级教程:如何高效映射C语言嵌套结构体与联合体JNA高级教程:如何高效映射C语言嵌套结构体与联合体

    本教程深入探讨了JNA在Java与C语言之间进行复杂数据类型映射的机制,特别是针对包含嵌套结构体和联合体(Union)的场景。文章通过分析一个实际的错误案例,详细阐述了JNA对Java类继承Structure或Union的严格要求,并提供了两种核心解决方案:一是直接构建与C语言定义精确对应的JNA映…

    2026年9月28日 • 用户投稿
    100
  • 百度地图地图加载慢怎么办

    百度地图地图加载慢怎么办百度地图地图加载慢怎么办百度地图地图加载慢怎么办百度地图地图加载慢怎么办

    网络不稳定是百度地图加载慢主因,应切换Wi-Fi或4G/5G并重启路由器;2. 清理应用缓存并关闭后台占用程序可提升运行速度;3. 降低地图显示为“普通”模式、更新应用至最新版本并避开晚8-10点高峰使用,能有效改善加载效率。 百度地图加载慢,通常和网络、设备性能或软件设置有关。直接尝试以下几个方法…

    2026年9月28日 • 用户投稿
    300
  • sublime怎么配置python的虚拟环境_Python虚拟环境集成指南

    sublime怎么配置python的虚拟环境_Python虚拟环境集成指南sublime怎么配置python的虚拟环境_Python虚拟环境集成指南sublime怎么配置python的虚拟环境_Python虚拟环境集成指南sublime怎么配置python的虚拟环境_Python虚拟环境集成指南

    答案是通过创建自定义构建系统和配置项目文件确保Sublime Text使用指定虚拟环境。具体做法包括:在.sublime-build文件中指定虚拟环境Python解释器路径,结合.cmd字段设置无缓冲运行参数-u,并在.sublime-project文件中为项目定义独立的build_systems与…

    2026年9月28日 • 用户投稿
    100
  • Safari浏览器触摸板手势有哪些_Safari浏览器Mac触控板常用手势操作大全

    Safari浏览器触摸板手势有哪些_Safari浏览器Mac触控板常用手势操作大全Safari浏览器触摸板手势有哪些_Safari浏览器Mac触控板常用手势操作大全Safari浏览器触摸板手势有哪些_Safari浏览器Mac触控板常用手势操作大全Safari浏览器触摸板手势有哪些_Safari浏览器Mac触控板常用手势操作大全

    1、双指左右轻扫可前进后退页面;2、单指用力点按预览链接内容;3、双指张开或捏合缩放页面;4、三指轻点查词释义;5、四指滑动切换全屏标签页。 如果您在使用Mac的Safari浏览器时希望提高操作效率,但对触控板的手势功能不够熟悉,可以通过学习一系列内置手势来实现快速导航和控制。以下是Safari浏览…

    2026年9月28日 • 用户投稿
    300
  • 如何在Docker中安装Linux环境_Docker容器运行Ubuntu系统

    如何在Docker中安装Linux环境_Docker容器运行Ubuntu系统如何在Docker中安装Linux环境_Docker容器运行Ubuntu系统如何在Docker中安装Linux环境_Docker容器运行Ubuntu系统如何在Docker中安装Linux环境_Docker容器运行Ubuntu系统

    首先拉取Ubuntu镜像并启动容器,使用docker pull ubuntu:20.04和docker run -it命令进入系统,安装软件需执行apt update并配置常用工具,通过-v参数实现文件挂载共享,建议用Dockerfile或提交容器保存配置以防丢失。 在Docker中安装Linux环…

    2026年9月28日 • 用户投稿
    100
  • JNA高级教程:深入理解原生结构体与联合体映射

    JNA高级教程:深入理解原生结构体与联合体映射JNA高级教程:深入理解原生结构体与联合体映射JNA高级教程:深入理解原生结构体与联合体映射JNA高级教程:深入理解原生结构体与联合体映射

    本教程详细探讨了JNA在与原生库交互时,如何正确映射包含嵌套结构体或联合体的复杂数据类型。文章首先分析了IllegalArgumentException的常见原因——非Structure类型字段导致JNA无法确定原生大小,随后提供了两种解决方案:一是直接通过JNA的Structure和Union类精…

    2026年9月28日 • 用户投稿
    100
  • 夸克怎么彻底卸载干净_夸克APP及相关数据完全清除教程

    夸克怎么彻底卸载干净_夸克APP及相关数据完全清除教程夸克怎么彻底卸载干净_夸克APP及相关数据完全清除教程夸克怎么彻底卸载干净_夸克APP及相关数据完全清除教程夸克怎么彻底卸载干净_夸克APP及相关数据完全清除教程

    彻底卸载夸克APP需先通过系统设置卸载主程序,再手动删除残留文件夹如/Android/data/com.quark.browser,清除账户同步数据,并使用清理工具深度扫描残留项。 如果您尝试从设备中移除夸克应用,但发现残留数据或配置文件仍然存在,则可能是由于卸载过程中未清除用户数据与缓存信息。以下…

    2026年9月28日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信