
通过统一数据库存储 session,可让多个 laravel 应用共享登录状态,实现单点登录(sso)式体验:用户在 app1 登录后跳转至 app2 仍保持认证,操作完成后返回 app1 无需重复登录。
在 Laravel 中实现多 Web 应用间 Session 共享,核心思路是剥离 Session 存储逻辑,使其脱离单应用本地环境,交由所有应用共用的中心化存储(如 MySQL 数据库)统一管理。这避免了文件、Redis 实例隔离或 Cookie 域名限制等常见障碍,是生产环境中稳定、可控的推荐方案。
✅ 前置准备:创建专用 Session 数据库
首先,在数据库服务器中新建一个独立数据库(例如 laravel_sessions),专用于存储所有应用的 session 记录。该库仅需一张表,Laravel 提供了标准迁移:
php artisan session:table php artisan migrate --database=sessions_database
⚠️ 注意:执行迁移前需确保 sessions_database 连接已正确配置(见下文),且该数据库已存在并具备写权限。
✅ 步骤一:配置多数据库连接
在 config/database.php 中新增一个名为 sessions_database 的数据库连接配置(与主库 default 并列),指向上述专用 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', 'homestead'),
'password' => env('DB_PASSWORD_SESSION', 'secret'),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
],同时,在 .env 文件中为两个应用保持完全一致的 Session 数据库配置:
# .env (App1 和 App2 均需相同) DB_CONNECTION_SESSION=mysql DB_HOST_SESSION=your-shared-db-host DB_PORT_SESSION=3306 DB_DATABASE_SESSION=laravel_sessions DB_USERNAME_SESSION=shared_user DB_PASSWORD_SESSION=shared_password
✅ 步骤二:切换 Session 驱动并指定连接
修改 config/session.php,将 driver 设为 database,并显式指定 connection 为上一步定义的连接名:
'driver' => env('SESSION_DRIVER', 'database'),
'connection' => env('SESSION_CONNECTION', 'sessions_database'),
'table' => 'sessions',
'expire_on_close' => false,
'lifetime' => 120, // 分钟,建议统一设置并在 .env 中确保:
SESSION_DRIVER=database SESSION_CONNECTION=sessions_database
✅ 关键点:两个应用必须使用相同的 session.cookie.domain(如 .example.com),否则浏览器不会在跨子域请求中携带 Cookie。若应用部署在不同主域(如 app1.com 与 app2.org),此方案不适用——需改用 OAuth2 或 JWT 等无状态认证方案。
✅ 补充说明与注意事项
- 安全性保障:Session 表中的 payload 字段已由 Laravel 自动加密(基于 APP_KEY),但所有共享 Session 的应用必须使用完全相同的 APP_KEY,否则解密失败导致会话无效。
-
清理机制:Laravel 会自动通过 session:gc 命令清理过期 session,建议在任一应用中配置定时任务(如 Laravel Scheduler)定期执行:
// app/Console/Kernel.php protected function schedule(Schedule $schedule) { $schedule->command('session:gc')->hourly(); } -
不推荐方案规避:
- ❌ 不要使用 file 驱动(文件路径无法共享);
- ❌ 避免多个应用共用同一 Redis 实例但未统一 prefix 或 database,易引发 key 冲突;
- ❌ 不要依赖 cookie 驱动跨域共享(受同源策略严格限制)。
通过以上配置,两个 Laravel 应用即可无缝共享用户会话状态——登录态、Flash 消息、自定义 Session 数据均实时同步。这是构建企业级多系统集成平台(如后台管理 + SaaS 子应用)的基础能力之一。










