feat: 封禁用户允许登录但禁止写操作
- Session 结构体新增 Status 字段,Create/Validate 同步状态 - AuthService.Login 移除封禁检查,允许封禁用户登录 - 新增 BannedWriteGuard 中间件,拦截 POST/PUT/DELETE 写操作 - 封禁用户自动签到跳过 - 所有需登录的 API 路由组应用 BannedWriteGuard - AdminService.UpdateUserStatus 保留 DestroyByUID 确保状态刷新
This commit is contained in:
@ -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
|
||||
|
||||
// 滑动窗口续期
|
||||
|
||||
@ -14,6 +14,7 @@ type Session struct {
|
||||
Username string // 用户名
|
||||
Avatar string // 头像 URL
|
||||
Role string // 角色
|
||||
Status string // 账号状态(active/banned/deleted/locked)
|
||||
Exp int // 经验值(用于前端实时展示等级)
|
||||
RememberMe bool // 是否持久化(决定 cookie maxAge)
|
||||
IP string // 登录 IP
|
||||
|
||||
Reference in New Issue
Block a user