You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel多Web应用单点认证:A登录后B显示用户名方案咨询

Laravel跨应用共享登录状态实现方案

针对你两个共用数据库的Laravel应用(系统A:uat-system.marsiajar.com,系统B:marsiajar.com),要实现系统A登录后系统B显示用户名,可通过以下两种方案实现:

方案一:共享Session(推荐,适配共用DB场景)

核心思路是让两个应用使用相同的加密密钥、共享Session存储(数据库),并配置跨域Cookie,实现登录状态同步。

具体步骤:

  1. 同步应用加密密钥
    将系统A .env 文件中的 APP_KEY 完全复制到系统B的 .env 中,确保两个应用的加密、Session签名逻辑一致。

  2. 配置Session驱动为数据库
    两个应用的 .env 中设置:

    SESSION_DRIVER=database
    

    若系统A已生成Session表,系统B无需重复迁移(共用同一数据库);若未生成,在任一应用执行:

    php artisan session:table
    php artisan migrate
    
  3. 配置跨域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',
    
  4. 系统B中获取用户信息
    完成上述配置后,系统B可直接通过Laravel Auth facade获取当前登录用户:

    // 在系统B的视图或控制器中
    @if(Auth::check())
        <span>当前用户:{{ Auth::user()->name }}</span>
    @endif
    

方案二:JWT令牌验证(适配严格跨域场景)

若浏览器跨域Cookie限制导致Session方案失效,可采用JWT令牌实现用户身份共享:

具体步骤:

  1. 安装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 完全一致。

  2. 系统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);
    
  3. 系统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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 09:20:30