Laravel 多应用共享 Session 的完整实现方案

7次阅读

Laravel 多应用共享 Session 的完整实现方案

本文介绍如何在 laravel 中通过统一数据库驱动实现多个 web 应用之间的 session 共享,支持跨应用登录态同步、无缝跳转与状态延续。

在微服务或模块化架构中,常需将业务拆分为多个独立部署的 laravel 应用(如 app1.example.com 和 app2.example.com),但又要求用户在其中一个应用登录后,跳转至另一应用时无需重复认证——即实现跨应用 session 共享。Laravel 原生不支持多域名间 cookie 共享(受同源策略与 Cookie 作用域限制),因此推荐采用 集中式数据库 Session 存储 方案,确保所有应用读写同一份 Session 数据。

✅ 核心实现思路

所有 Laravel 应用共用一个专用的 sessions 数据库(或同一数据库中的独立 sessions 表),并统一配置为 database Session 驱动。关键在于:

  • 隔离存储:Session 数据不依赖各应用的主数据库,避免耦合;
  • 统一连接:所有应用指向同一个 Session 数据库连接;
  • 一致密钥:确保 APP_KEY 相同(用于加密 Session 内容),否则解密失败会导致会话无效(⚠️重要!);
  • Cookie 域适配(可选):若应用同属子域名(如 app1.domain.com / app2.domain.com),可配置 SESSION_DOMAIN=.domain.com 实现 Cookie 共享,但本方案以数据库共享为主,更可靠且不受跨域限制。

? 配置步骤详解

1. 创建专用 Session 数据库

CREATE DATABASE laravel_sessions CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 然后运行迁移生成 sessions 表 php artisan session:table php artisan migrate --database=sessions_database

2. 配置多数据库连接(config/database.php

'connections' => [     // 主应用数据库(保持不变)     'mysql' => [         'driver' => env('DB_CONNECTION', 'mysql'),         // ... 其他配置     ],      // 专用 Session 数据库连接     'sessions_database' => [         'driver'    => env('DB_CONNECTION_SESSION', 'mysql'),         'host'      => env('DB_HOST_SESSION', '127.0.0.1'),         'port'      => env('DB_PORT_SESSION', '3306'),         'database'  => env('DB_DATABASE_SESSION', 'laravel_sessions'),         'username'  => env('DB_USERNAME_SESSION', 'root'),         'password'  => env('DB_PASSWORD_SESSION', ''),         'charset'   => 'utf8mb4',         'collation' => 'utf8mb4_unicode_ci',         'prefix'    => '',         'strict'    => true,     ], ],

3. 指定 Session 使用该连接(config/session.php)

'driver' => env('SESSION_DRIVER', 'database'), 'connection' => env('SESSION_CONNECTION', 'sessions_database'), 'table' => 'sessions', 'expire_on_close' => false, 'lifetime' => 120, // 分钟

4. 环境变量统一(.env,两个应用均需设置)

SESSION_DRIVER=database SESSION_CONNECTION=sessions_database  # Session 数据库凭证(必须完全一致) DB_CONNECTION_SESSION=mysql DB_HOST_SESSION=your-session-db-host DB_PORT_SESSION=3306 DB_DATABASE_SESSION=laravel_sessions DB_USERNAME_SESSION=shared_user DB_PASSword_SESSION=shared_password  # ⚠️ 关键:两个应用必须使用相同的 APP_KEY! APP_KEY=base64:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=

✅ 验证与注意事项

  • 登录态同步验证:在 App1 登录后,直接访问 App2 的 /api/user(需启用 auth:sanctum 或 auth:web 中间件),应能获取当前用户;
  • ⚠️ 安全性提醒:APP_KEY 泄露等于 Session 可被伪造,请严格保护 .env 文件权限;
  • ⚠️ 性能考虑:高频 Session 读写建议为 sessions 表的 id 和 last_activity 字段添加索引;
  • ? 退出同步:Laravel 默认不自动广播登出事件,如需全局登出,需自行实现 redis Pub/Sub 或数据库标记机制;
  • ? 跨协议/跨域兼容:该方案完全绕过 Cookie 限制,即使 App1 是 https://a.com、App2 是 https://b.net 也能共享 Session(前提是后端可直连同一数据库)。

通过以上配置,两个 Laravel 应用即可真正实现 Session 数据级共享,为单点登录(SSO)轻量级落地提供坚实基础。

text=ZqhQzanResources