外观
Legacy Session Redis 桥接
老 LIMS 登录后把 users 行 JSON 写入 Redis;beta 读同一条 key 灌进 Laravel Session。键名拼法在 LimsSessionDef,legacy / beta 各一份,改一处必须改另一处。
| 侧 | 类 |
|---|---|
| legacy | classes/LimsSessionDef.php |
| beta | app/Foundation/Def/LimsSessionDef.php |
改契约后跑 php artisan test --filter=LimsSessionDef,并改本文。
Redis key
{redis_key_prefix}{session_id}session_id 来自 Cookie,一般是 PHPSESSID,也可能是 {dw_biaozhi}_PS,以浏览器为准。前缀只走配置,代码里不要写死。
| legacy | beta | |
|---|---|---|
| 前缀 | legacy_session_redis_prefix | LEGACY_SESSION_REDIS_PREFIX |
| 连接 | redis_host 等 | LEGACY_SESSION_REDIS_CONNECTION |
| TTL | login_expire_time(n_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
Cookie
beta 默认读 PHPSESSID,可用 LEGACY_SESSION_COOKIE 改。老站若用 {dw_biaozhi}_PS,两边要对齐现场实际 Cookie 名。
Laravel Session
桥接成功后的用户数组写在 Laravel Session,默认键 _legacy_user(LEGACY_USER_SESSION_KEY)。CurrentUserService 只从这里取当前用户。
Redis value
JSON,legacy 在登录、改密、续期时写,beta 只读。必须有 id(users 主键)、userid、fzx_id、login_time。password 落 Redis 前改成 ******。
Beta LegacySessionMirrorValidator 在桥接时校验:
| reason | 含义 |
|---|---|
redis_empty / mirror_expired | 镜像缺失或 login_time + ttl 过期 |
missing_* | 必要身份字段缺失 |
user_id_mismatch / userid_mismatch / fzx_id_mismatch | Auth 用户与镜像不一致 |
auth_user_not_found | loginUsingId 未命中 |
失败时清除残留 _legacy_user/Auth,不设桥接成功标志;legacy.auth 记 legacy_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 仍只服务老入口。
退出顺序
- Beta 顶栏「退出」→
/beta/logout→ 302/exit.php?from=beta exit.php:legacy_session_redis_delete()+ 销毁老 PHP Session;清非 HttpOnly Cookie;固定跳/beta/logout/finish(禁止任意 continue)/beta/logout/finish:Auth::logout()+session()->invalidate()+ 换 CSRF;再跳/beta/login- 仅走老
exit.php(无 from=beta)时:老态已清;Beta 下次受保护请求因镜像缺失被桥接拒绝并清残留 Auth
HttpOnly 的 PHPSESSID / Laravel Session Cookie 不能靠 exit.php 前端脚本删除,必须靠服务端销毁。
日志
业务日志不要打完整 key / session id,用 LimsSessionDef::keyHash($key)。桥接未执行时 LegacySessionBridge 记 legacy_session.bridge_skipped;门禁拒绝记 legacy_session.auth_rejected。