feat: 封禁用户允许登录但禁止写操作

- Session 结构体新增 Status 字段,Create/Validate 同步状态
- AuthService.Login 移除封禁检查,允许封禁用户登录
- 新增 BannedWriteGuard 中间件,拦截 POST/PUT/DELETE 写操作
- 封禁用户自动签到跳过
- 所有需登录的 API 路由组应用 BannedWriteGuard
- AdminService.UpdateUserStatus 保留 DestroyByUID 确保状态刷新
This commit is contained in:
2026-05-31 21:20:04 +08:00
parent a84fa5da61
commit bbcd992614
7 changed files with 44 additions and 18 deletions

View File

@ -39,6 +39,7 @@ func (m *Manager) Create(user *model.User, rememberMe bool, ip, userAgent string
Username: user.Username,
Avatar: user.Avatar,
Role: user.Role,
Status: user.Status,
Exp: user.Exp,
RememberMe: rememberMe,
IP: ip,
@ -54,7 +55,7 @@ func (m *Manager) Create(user *model.User, rememberMe bool, ip, userAgent string
}
// Validate 验证会话:读取 → 检查过期 → 检查用户状态 → 续期 → 返回
// 返回 nil 表示会话无效(不存在/过期/用户被封禁
// 若用户不存在则返回 nil被封禁/锁定用户仍返回 session由上层中间件决定可访问范围
func (m *Manager) Validate(sid string) (*Session, error) {
if sid == "" {
return nil, nil
@ -65,7 +66,7 @@ func (m *Manager) Validate(sid string) (*Session, error) {
return nil, nil
}
// 检查用户是否仍然有效(封禁/注销后拒绝已有会话)
// 检查用户是否仍然存在
user, err := m.userRepo.FindByIDForAuth(s.UserID)
if err != nil {
log.Printf("[SessionManager] Validate: user not found uid=%d err=%v", s.UserID, err)
@ -73,17 +74,11 @@ func (m *Manager) Validate(sid string) (*Session, error) {
return nil, nil
}
// 封禁用户直接拒绝
if user.Status == model.StatusBanned {
log.Printf("[SessionManager] Validate: user banned uid=%d", s.UserID)
m.store.Delete(sid)
return nil, nil
}
// 同步 DB 最新字段(头像/用户名/角色/经验值等可能已变更)
// 同步 DB 最新字段(头像/用户名/角色/状态/经验值等可能已变更)
s.Avatar = user.Avatar
s.Username = user.Username
s.Role = user.Role
s.Status = user.Status
s.Exp = user.Exp
// 滑动窗口续期