Skip to content

Legacy Session Redis 桥接

老 LIMS 登录后把 users 行 JSON 写入 Redis;beta 读同一条 key 灌进 Laravel Session。键名拼法在 LimsSessionDef,legacy / beta 各一份,改一处必须改另一处。

legacyclasses/LimsSessionDef.php
betaapp/Foundation/Def/LimsSessionDef.php

改契约后跑 php artisan test --filter=LimsSessionDef,并改本文。


Redis key

{redis_key_prefix}{session_id}

session_id 来自 Cookie,一般是 PHPSESSID,也可能是 {dw_biaozhi}_PS,以浏览器为准。前缀只走配置,代码里不要写死。

legacybeta
前缀legacy_session_redis_prefixLEGACY_SESSION_REDIS_PREFIX
连接redis_hostLEGACY_SESSION_REDIS_CONNECTION
TTLlogin_expire_timen_set启动默认 LEGACY_SESSION_TTL_MINUTES / SESSION_LIFETIME;web 请求由 DynamicSessionLifetime 覆盖为同一 login_expire_time

单台部署核对(Cookie Path/HTTPS/Secure、Session 目录、Redis PING、/beta/health)见 DEPLOY.md § Session / Cookie / Redis。老系统原生 Session 仍走 session.save_handler;本镜像只做桥接,不替代原生 Session,也不要求多节点共享。

php
// legacy
LimsSessionDef::legacyBridgeRedisKey($sessionId, $prefix);

// beta
\App\Foundation\Def\LimsSessionDef::legacyBridgeRedisKey($sessionId, $prefix);

legacy 入口:legacy_session_redis_key()temp/legacy_session_redis.php
beta 入口:Http/Middleware/LegacySessionBridge.php


beta 默认读 PHPSESSID,可用 LEGACY_SESSION_COOKIE 改。老站若用 {dw_biaozhi}_PS,两边要对齐现场实际 Cookie 名。


Laravel Session

桥接成功后的用户数组写在 Laravel Session,默认键 _legacy_userLEGACY_USER_SESSION_KEY)。CurrentUserService 只从这里取当前用户。


Redis value

JSON,legacy 在登录、改密、续期时写,beta 只读。必须有 idusers 主键)、useridfzx_idlogin_timepassword 落 Redis 前改成 ******

Beta LegacySessionMirrorValidator 在桥接时校验:

reason含义
redis_empty / mirror_expired镜像缺失或 login_time + ttl 过期
missing_*必要身份字段缺失
user_id_mismatch / userid_mismatch / fzx_id_mismatchAuth 用户与镜像不一致
auth_user_not_foundloginUsingId 未命中

失败时清除残留 _legacy_user/Auth,不设桥接成功标志;legacy.authlegacy_session.auth_rejected 并跳登录页。

浏览器导航未登录 → 跳 legacy.login_path;AJAX/Accept: application/json{ code: 401, message, data: null }(Laravel 约定,不改老 AJAX 的 error/content 格式)。Laravel CSRF 失败走 HTTP 419 JSON;老 token_key / Cookie csrf_token 仍只服务老入口。


退出顺序

  1. Beta 顶栏「退出」→ /beta/logout → 302 /exit.php?from=beta
  2. exit.phplegacy_session_redis_delete() + 销毁老 PHP Session;清非 HttpOnly Cookie;固定跳 /beta/logout/finish(禁止任意 continue)
  3. /beta/logout/finishAuth::logout() + session()->invalidate() + 换 CSRF;再跳 /beta/login
  4. 仅走老 exit.php(无 from=beta)时:老态已清;Beta 下次受保护请求因镜像缺失被桥接拒绝并清残留 Auth

HttpOnly 的 PHPSESSID / Laravel Session Cookie 不能靠 exit.php 前端脚本删除,必须靠服务端销毁。


日志

业务日志不要打完整 key / session id,用 LimsSessionDef::keyHash($key)。桥接未执行时 LegacySessionBridgelegacy_session.bridge_skipped;门禁拒绝记 legacy_session.auth_rejected