You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
wanghanlin
0838dca61a
fix(auth): 修复后台会话长期不失效,JWT 时间配置改用可读单位
问题
- 关闭后台页面数天后重新打开,可跳过登录页直接进入后台
- 根因:refresh token 有效期 7 天且滚动续期无上限;refresh Cookie 为持久化 Cookie
(maxAge 硬编码 7 天)在浏览器关闭后不会删除,重开页面时 App.vue 启动自检发现
/auth/me 返回 401,静默调 /auth/refresh 换发新 token 并重置窗口 —— 只要 7 天内
来访一次即等效永久会话
会话有效期修复
- application.yml:refresh-expiration 由 7 天改为 8h,作为会话时长的唯一配置项,
所有环境统一生效(不在 dev/prod 覆盖)
- auth/AuthController:refresh Cookie 的 Max-Age 由硬编码 7*24*60*60 改为读
jwt.refresh-expiration,消除「改配置不改 Cookie」造成的有效期漂移
- App.vue:刷新 token 成功后二次校验 /auth/me,失败即登出;修复原先
.catch(() => {}) 丢弃返回值导致用户带着空 currentUser 进入后台、权限判断全部
失效、直到某个请求 401 才被踢出的漏洞
JWT 时间配置改用 Duration 可读格式
- expiration / refresh-expiration / sdk-expiration 均绑定为 java.time.Duration,
值写成 15m / 8h / 2h;纯数字仍按毫秒解析,向后兼容旧配置
- JwtTokenProvider 兜底默认值由 604800000(7 天,与 yml 的 8 小时并不一致)修正为 8h
- SdkJwtTokenProvider:默认有效期改 Duration,钳制边界 MIN/MAX_EXPIRATION 改为
Duration.ofMinutes(5) / Duration.ofDays(1),并公开 clampExpirationMillis 供控制器复用
SDK 配置接通
- controller/AuthController(SDK):默认 ttl 改读 jwt.sdk-expiration。此前硬编码
7200000L,而唯一读该配置的 3 参 generateToken 无任何调用方,属改了不生效的死配置
- 控制器内不再出现 300000L / 86400000L 等毫秒魔数,expiresIn 与 token 实际有效期
保持一致(对外的 ttl / expiresIn 单位仍为秒,契约不变)
验证
- 实测 Duration 绑定链路:15m→PT15M(900s)、8h→PT8H(28800s)、2h→PT2H(7200s),
纯数字 28800000→PT8H(28800s),确认向后兼容
- mvn clean package -P prod 构建通过(含前端构建)
文档
- CLAUDE.md 同步会话有效期约定、Duration 单位规范、SDK Token 有效期约定
已知残留
- 仍保留滚动续期,页面持续活跃的用户不会掉线;彻底杜绝需引入绝对过期上限或服务端
落库记录最后活动时间,本次未做
|
2 days ago |
| .. |
|
config.test.ts
|
SDK 新增 6 项功能完善(类型导出/窗口配置/错误回调/测试/分组/通知)
|
3 months ago |