Laravel 7子域间会话共享问题咨询
Laravel 7 跨子域名实现单点登录(SSO)
要实现blog1(http://blog.com)登录后,访问blog2(http://blog2.blog.com)自动处于登录状态,需完成以下配置(你的现有配置已满足部分条件,补充剩余配置即可):
1. 核心共享配置确认
- 必须使用相同的
APP_KEY:你已在两个项目的.env中配置了相同的APP_KEY,这是关键——Laravel用它加密Session和Cookie,不一致会导致跨项目无法解析登录状态。 - 共享Session存储驱动:blog1已使用
database作为Session驱动,blog2必须同步配置,且两个项目需连接同一个数据库(或共享Session表)。
2. 统一Session域名配置
两个项目的Session域名都要设置为.blog.com,确保Cookie在所有子域名下生效:
- Blog1的
config/session.php已正确配置:'driver' => env('SESSION_DRIVER', 'database'), 'domain' => env('SESSION_DOMAIN', '.blog.com'), - 给Blog2补充配置:
在config/session.php中添加:
同时在Blog2的'driver' => env('SESSION_DRIVER', 'database'), 'domain' => env('SESSION_DOMAIN', '.blog.com'),.env中新增:SESSION_DRIVER=database SESSION_DOMAIN=.blog.com
3. 同步Session表与用户表
- 如果Blog2还没有Session表,运行以下命令生成并迁移表结构:
确保该表与Blog1的php artisan session:table php artisan migratesession表处于同一个数据库,结构完全一致。 - 两个项目需共享用户数据:要么连接同一个用户表,要么保证用户表结构完全相同且用户数据同步——登录状态基于用户ID,用户数据不一致会导致跨项目无法识别登录用户。
4. 优化Cookie跨域传递(可选)
为避免浏览器跨域Cookie限制,可调整Session的SameSite属性:
在两个项目的config/session.php中修改:
'same_site' => 'none', 'secure' => env('SESSION_SECURE_COOKIE', false), // HTTP环境设为false,HTTPS环境设为true
测试验证
- 清除浏览器缓存和Cookie,避免旧数据干扰。
- 在blog1完成登录,访问blog2即可看到已处于登录状态。
内容的提问来源于stack exchange,提问作者Nana
相关产品推荐
相关产品推荐

