
本文介绍如何在 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)轻量级落地提供坚实基础。










