用户 2026-09-16 提出:「用户端和管理端登录有效期改成30天」。目标是减少频繁重新登录,同时把会话有效期这一安全参数集中到一处、可测可查。
server/app/lexgo/service.go:165
expiry := now.Add(8 * time.Hour)
lexgo_sessions
token_hash
owner_id
expires_at
loginCredentials
expires_at > now
server/app/lexgo/integration_test.go:284
docs/03
SessionLifetime
expiresAt
滑动续期或"记住我"开关、JWT 迁移、按角色区分有效期(用户已明确两端都是 30 天)、会话管理界面。
无前置工单。文档影响:Business-Rules-and-Glossary(会话有效期与撤销规则)、 Local-Development-and-Verification(如何验证与排错)、Architecture-and-Code-Map(会话参数位置)、Home 记录本次变化。
Business-Rules-and-Glossary
Local-Development-and-Verification
Architecture-and-Code-Map
Home
server/app/lexgo/service.go
SessionLifetime = 30 * 24 * time.Hour
now.Add(SessionLifetime)
8 * time.Hour
LEXGO_TEST_DB_NAME=lexgo_test_issue42 python scripts/server.py test-integration
TestMySQLSessionLifetimeIsThirtyDays
TestMySQLAccountIsolationAndRevocation
SessionLifetime - 1h
python -m unittest discover -s tests
管理端与学习端未改动(有效期完全由服务端裁决),因此未新增前端测试;本机开发库 lexgo_dev 仍停在 #40 的 schema v12,而本分支基于 main(v11),所以没有在该库上做真机验证——真实链路的行为由上面的 HTTP 层集成测试覆盖,待 #40 合入后再在开发实例上复验一次。这是刻意避免跨分支污染,不是能力缺口。
lexgo_dev
令牌泄露后的可用窗口由 8 小时变为 30 天,放大约 90 倍。现有缓解手段全部保留(只存摘要、改密码/停用 立即全撤销、退出撤销当前会话、账号间数据隔离);未包含:刷新令牌与轮换、设备/会话列表、 "退出其他设备"、按角色区分有效期。如需这些,请让我另开单元工单。
591f816
fix/42-session-lifetime-30-days
1f89692c
64a83458
45306a5d
b59bdc8b
4ed96aac
docs/
python dev_scripts/harness.py sync
请验收;确认后我执行验收记录、镜像同步与复核、fast-forward 合并、关闭工单并登记父工单。
契约与完整证据见评论 8260;分支 fix/42-session-lifetime-30-days,PR #43 未合并,等待用户验收。
验收通过后我再执行:验收记录 → 核心镜像同步与复核(#40 合入后)→ fast-forward 合并 → 关闭工单 → 勾选父工单 #16。
用户 2026-09-16 回复「#32 #40 验收通过、#42 验收通过」,本单验收结论如下。
4e4fb85
30天-1h
e6e3b2a9
a482d5ba
42945de
工单关闭。
No dependencies set.
The note is not visible to the blocked user.
来源与目标
用户 2026-09-16 提出:「用户端和管理端登录有效期改成30天」。目标是减少频繁重新登录,同时把会话有效期这一安全参数集中到一处、可测可查。
现状(已核实,非估计)
server/app/lexgo/service.go:165的expiry := now.Add(8 * time.Hour)lexgo_sessions(token_hash主键、owner_id、expires_at)只保存令牌的 SHA-256 摘要,客户端持有随机令牌loginCredentials之后按expires_at > now判断;登录时会顺带清理该账号已过期会话server/app/lexgo/integration_test.go:284(时钟前进 9 小时断言过期)、docs/03的会话规则数字方案
SessionLifetime,登录时统一使用;仍然不做滑动续期,到期必须重新登录。expiresAt,客户端行为不变。影响与风险(安全边界)
非目标
滑动续期或"记住我"开关、JWT 迁移、按角色区分有效期(用户已明确两端都是 30 天)、会话管理界面。
验收标准
expires_at自然过渡。依赖与文档影响
无前置工单。文档影响:
Business-Rules-and-Glossary(会话有效期与撤销规则)、Local-Development-and-Verification(如何验证与排错)、Architecture-and-Code-Map(会话参数位置)、Home记录本次变化。#42 实施完成,待验收(2026-09-16)
改动
server/app/lexgo/service.go:新增具名常量SessionLifetime = 30 * 24 * time.Hour,登录改用now.Add(SessionLifetime)(原为8 * time.Hour)。学习端与管理端共用同一登录接口,所以两端同时生效。已有会话按各自
expires_at自然过渡。服务端只保存令牌的 SHA-256 摘要。
测试(真实执行)
LEXGO_TEST_DB_NAME=lexgo_test_issue42 python scripts/server.py test-integration)TestMySQLSessionLifetimeIsThirtyDaysexpiresAt与库内expires_at一致(毫秒精度)、库内查不到原始令牌、新会话立即可用TestMySQLAccountIsolationAndRevocation(改按常量断言)SessionLifetime - 1h仍返回 200,再前进 2 小时返回 401python -m unittest discover -s tests管理端与学习端未改动(有效期完全由服务端裁决),因此未新增前端测试;本机开发库
lexgo_dev仍停在#40 的 schema v12,而本分支基于 main(v11),所以没有在该库上做真机验证——真实链路的行为由上面的
HTTP 层集成测试覆盖,待 #40 合入后再在开发实例上复验一次。这是刻意避免跨分支污染,不是能力缺口。
安全影响(需你确认的代价)
令牌泄露后的可用窗口由 8 小时变为 30 天,放大约 90 倍。现有缓解手段全部保留(只存摘要、改密码/停用
立即全撤销、退出撤销当前会话、账号间数据隔离);未包含:刷新令牌与轮换、设备/会话列表、
"退出其他设备"、按角色区分有效期。如需这些,请让我另开单元工单。
提交与文档
591f816;分支fix/42-session-lifetime-30-days;PR #43 未合并。1f89692c(会话规则数字已由 8 小时改为 30 天并注明来源)、Architecture-and-Code-Map
64a83458、Local-Development-and-Verification45306a5d、Homeb59bdc8b、Project-Profile
4ed96aac。docs/暂未导出:线上 Wiki 现在同时包含 #40 与 #42 的段落,若在此分支导出会把 #40 的内容混进本分支差异;将在验收(#40 合入后)执行
python dev_scripts/harness.py sync并复核。请验收;确认后我执行验收记录、镜像同步与复核、fast-forward 合并、关闭工单并登记父工单。
#42 状态:待验收(2026-09-16)
契约与完整证据见评论 8260;分支 fix/42-session-lifetime-30-days,PR #43 未合并,等待用户验收。
验收通过后我再执行:验收记录 → 核心镜像同步与复核(#40 合入后)→ fast-forward 合并 → 关闭工单 → 勾选父工单 #16。
#42 验收通过(2026-09-16)
用户 2026-09-16 回复「#32 #40 验收通过、#42 验收通过」,本单验收结论如下。
4e4fb85。SessionLifetime,绝对有效期、不滑动续期);无 schema 与接口字段变化;撤销规则不变(退出撤销当前会话,改密码/停用/重置撤销该账号全部会话)。
expires_at与响应一致、会话可用、schema v12、两本词典在位。
30天-1h可用、再 +2h 拒绝);治理 65 项。
1f89692c(会话规则数字已改)、Architecture64a83458、Local-Development
45306a5d、Homee6e3b2a9、Project-Profilea482d5ba;镜像随验收提交42945de导出并复核一致。未包含,如需另开工单。
工单关闭。