fix: 移除服务端登录会话去重逻辑
- 去重会合并标准模式/无痕模式的独立会话,不符合预期 - 防重复提交由前端按钮禁用保证即可,服务端无需干预
This commit is contained in:
@ -2,7 +2,6 @@ package session
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"log"
|
"log"
|
||||||
"sync"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"metazone.cc/metalab/internal/config"
|
"metazone.cc/metalab/internal/config"
|
||||||
@ -19,43 +18,15 @@ type Manager struct {
|
|||||||
store Store
|
store Store
|
||||||
userRepo userStore
|
userRepo userStore
|
||||||
cfg *config.Config
|
cfg *config.Config
|
||||||
mu sync.Mutex
|
|
||||||
recentLogin map[uint]*loginEntry // uid → 最近一次登录记录(防重复创建)
|
|
||||||
}
|
|
||||||
|
|
||||||
type loginEntry struct {
|
|
||||||
sid string
|
|
||||||
ip string
|
|
||||||
userAgent string
|
|
||||||
createdAt time.Time
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewManager 构造函数
|
// NewManager 构造函数
|
||||||
func NewManager(store Store, userRepo userStore, cfg *config.Config) *Manager {
|
func NewManager(store Store, userRepo userStore, cfg *config.Config) *Manager {
|
||||||
return &Manager{
|
return &Manager{store: store, userRepo: userRepo, cfg: cfg}
|
||||||
store: store,
|
|
||||||
userRepo: userRepo,
|
|
||||||
cfg: cfg,
|
|
||||||
recentLogin: make(map[uint]*loginEntry),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create 创建会话并写入存储(同用户+同 IP+同 UA 在 10 秒内重复调用时返回已有会话,防重复创建)
|
// Create 创建会话并写入存储
|
||||||
func (m *Manager) Create(user *model.User, rememberMe bool, ip, userAgent string) (string, error) {
|
func (m *Manager) Create(user *model.User, rememberMe bool, ip, userAgent string) (string, error) {
|
||||||
m.mu.Lock()
|
|
||||||
// 幂等检查:同用户+同 IP+同 UA,10 秒内不重复创建
|
|
||||||
if entry, ok := m.recentLogin[user.ID]; ok {
|
|
||||||
if entry.ip == ip && entry.userAgent == userAgent && time.Since(entry.createdAt) < 10*time.Second {
|
|
||||||
// 验证旧会话仍然有效
|
|
||||||
if s, _ := m.store.Get(entry.sid); s != nil {
|
|
||||||
m.mu.Unlock()
|
|
||||||
log.Printf("[SessionManager] Create dedup uid=%d reuse sid=%s", user.ID, entry.sid[:16]+"...")
|
|
||||||
return entry.sid, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
m.mu.Unlock()
|
|
||||||
|
|
||||||
sid, err := NewID()
|
sid, err := NewID()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
@ -76,11 +47,6 @@ func (m *Manager) Create(user *model.User, rememberMe bool, ip, userAgent string
|
|||||||
if err := m.store.Set(s); err != nil {
|
if err := m.store.Set(s); err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
m.mu.Lock()
|
|
||||||
m.recentLogin[user.ID] = &loginEntry{sid: sid, ip: ip, userAgent: userAgent, createdAt: now}
|
|
||||||
m.mu.Unlock()
|
|
||||||
|
|
||||||
log.Printf("[SessionManager] Created sid=%s uid=%d rememberMe=%v ip=%s", sid[:16]+"...", user.ID, rememberMe, ip)
|
log.Printf("[SessionManager] Created sid=%s uid=%d rememberMe=%v ip=%s", sid[:16]+"...", user.ID, rememberMe, ip)
|
||||||
return sid, nil
|
return sid, nil
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user