优化报销管理增加挂靠

This commit is contained in:
hero920103 committed 2026-11-06 01:13:28 +08:00
1 parent 7b1c94b5ff
commit ee49ef15b5
24 files changed
+1267 -70

No files matched your search

+41
View File
@@ -133,6 +133,47 @@ func CreateSession(info SessionInfo) (*models.AuthSession, error) {
return s, nil
}
// ReuseSession 授权码换令牌时复用登录阶段已经建立的会话。
//
// authorize 阶段已经用 yz_sid Cookie 校验过登录态,换码只是给这个已登录会话
// 签发令牌,不应再 CreateSession:默认「1 号 1 机」策略会把刚登录的会话踢成
// revoked,而浏览器 Cookie 里仍是旧 sid,之后任何一次回到认证中心都会被判定
// 未登录并重新显示登录页(表现为「登录成功后又跳回登录界面」)。
//
// 找不到有效会话(过期、被下线等)时才回退到新建会话。
func ReuseSession(info SessionInfo) (*models.AuthSession, error) {
var list []models.AuthSession
_, err := models.Orm.QueryTable(new(models.AuthSession)).
Filter("identity_id", info.IdentityID).
Filter("tid", info.Tid).
Filter("revoked", 0).
OrderBy("-login_at").
All(&list)
if err == nil {
now := time.Now()
var fallback *models.AuthSession
for i := range list {
if !list[i].ExpiresAt.After(now) {
continue
}
// 优先复用同一应用的登录会话;同一浏览器会话被多个应用共享时,
// client_id 可能为空(直接访问登录页),此时复用最近的有效会话。
if list[i].ClientID == info.ClientID {
_ = TouchSession(list[i].Sid)
return &list[i], nil
}
if fallback == nil {
fallback = &list[i]
}
}
if fallback != nil {
_ = TouchSession(fallback.Sid)
return fallback, nil
}
}
return CreateSession(info)
}
// GetSession 查询有效会话(已吊销或已过期返回错误)
func GetSession(sid string) (*models.AuthSession, error) {
var s models.AuthSession