Laravel多Web应用单点认证:A登录后B显示用户名方案咨询
针对你两个共用数据库的Laravel应用(系统A:uat-system.marsiajar.com,系统B:marsiajar.com),要实现系统A登录后系统B显示用户名,可通过以下两种方案实现:
方案一:共享Session(推荐,适配共用DB场景)
核心思路是让两个应用使用相同的加密密钥、共享Session存储(数据库),并配置跨域Cookie,实现登录状态同步。
具体步骤:
同步应用加密密钥
将系统A.env文件中的APP_KEY完全复制到系统B的.env中,确保两个应用的加密、Session签名逻辑一致。配置Session驱动为数据库
两个应用的.env中设置:SESSION_DRIVER=database若系统A已生成Session表,系统B无需重复迁移(共用同一数据库);若未生成,在任一应用执行:
php artisan session:table php artisan migrate配置跨域Session Cookie
两个应用的.env中设置Session域为根域名,确保子域名可共享Cookie:SESSION_DOMAIN=.marsiajar.com SESSION_SECURE=true # 适配HTTPS环境 SESSION_HTTPONLY=true同时在
config/session.php中调整SameSite属性(根据浏览器兼容性选择):'same_site' => 'lax', // 若跨域限制严格,可设为'none',需配合SESSION_SECURE=true // 'same_site' => 'none',系统B中获取用户信息
完成上述配置后,系统B可直接通过Laravel Auth facade获取当前登录用户:// 在系统B的视图或控制器中 @if(Auth::check()) <span>当前用户:{{ Auth::user()->name }}</span> @endif
方案二:JWT令牌验证(适配严格跨域场景)
若浏览器跨域Cookie限制导致Session方案失效,可采用JWT令牌实现用户身份共享:
具体步骤:
安装JWT扩展包
两个应用都安装tymon/jwt-auth包:composer require tymon/jwt-auth执行初始化命令生成配置文件:
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider" php artisan jwt:secret确保两个应用的
.env中JWT_SECRET完全一致。系统A登录后生成JWT并存储到跨域Cookie
在系统A的登录逻辑中,验证用户成功后生成JWT,写入Cookie(域设为根域名):use Tymon\JWTAuth\Facades\JWTAuth; // 登录验证通过后 $token = JWTAuth::fromUser($user); return response() ->redirectTo('/dashboard') ->cookie('auth_token', $token, 60*24*7, '/', '.marsiajar.com', true, true);系统B验证JWT并获取用户信息
在系统B中,创建中间件读取Cookie中的JWT令牌,验证后绑定用户:// 中间件代码示例 use Tymon\JWTAuth\Facades\JWTAuth; public function handle($request, Closure $next) { if ($token = $request->cookie('auth_token')) { try { $user = JWTAuth::setToken($token)->authenticate(); auth()->login($user); } catch (\Exception $e) { // 令牌无效,清除Cookie return $next($request)->cookie('auth_token', null); } } return $next($request); }注册中间件后,在路由中使用,即可在视图/控制器中通过
Auth::user()获取用户名。
注意事项:
- 确保两个应用的
User模型结构完全一致(表名、字段匹配),避免读取用户数据时出错。 - 测试前清除浏览器缓存及旧Cookie,确保新配置生效。
内容的提问来源于stack exchange,提问作者Bin Ski.

