From 2f33e1e680f82df16b4783768e8aeb75146e218f Mon Sep 17 00:00:00 2001 From: shanshanzhong Date: Thu, 12 Mar 2026 03:05:34 -0700 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=B8=A2=E5=85=B6=E4=BB=96=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E6=97=B6=E4=B8=8D=E5=86=8D=E6=B8=85=E9=99=A4=E8=B8=A2?= =?UTF-8?q?=E4=BA=BA=E8=80=85=E8=87=AA=E5=B7=B1=E7=9A=84=20session?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit logoutUnbind 循环清理家庭成员时,踢人者(kicker)也在成员列表中, 导致 kicker 的设备被踢、session 被清,自己也下线了。 现在跳过 kickerUserID,只清缓存不踢设备不清 session。 Co-Authored-By: claude-flow --- internal/logic/public/user/unbindDeviceLogic.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/internal/logic/public/user/unbindDeviceLogic.go b/internal/logic/public/user/unbindDeviceLogic.go index 9e32057..8f9dfe9 100644 --- a/internal/logic/public/user/unbindDeviceLogic.go +++ b/internal/logic/public/user/unbindDeviceLogic.go @@ -66,10 +66,10 @@ func (l *UnbindDeviceLogic) UnbindDevice(req *types.UnbindDeviceRequest) error { } currentSessionID, _ := l.ctx.Value(constant.CtxKeySessionID).(string) - return l.logoutUnbind(targetUser, device, currentSessionID) + return l.logoutUnbind(userInfo.Id, targetUser, device, currentSessionID) } -func (l *UnbindDeviceLogic) logoutUnbind(userInfo *user.User, device *user.Device, currentSessionID string) error { +func (l *UnbindDeviceLogic) logoutUnbind(kickerUserID int64, userInfo *user.User, device *user.Device, currentSessionID string) error { // 1. 事务前查出 AuthMethods,用于事务后清邮箱缓存 authMethods, _ := l.svcCtx.UserModel.FindUserAuthMethods(l.ctx, userInfo.Id) @@ -210,7 +210,7 @@ func (l *UnbindDeviceLogic) logoutUnbind(userInfo *user.User, device *user.Devic // 7. 清除该用户所有 session(旧 token 全部失效) l.clearAllSessions(userInfo.Id) - // 8. 清理受影响的家庭成员缓存 + 踢设备 + 清 session + // 8. 清理受影响的家庭成员缓存 + 踢设备 + 清 session(跳过踢人者自己) for _, memberID := range familyMemberIDs { if memberUser, findErr := l.svcCtx.UserModel.FindOne(l.ctx, memberID); findErr == nil { if clearErr := l.svcCtx.UserModel.ClearUserCache(l.ctx, memberUser); clearErr != nil { @@ -221,6 +221,11 @@ func (l *UnbindDeviceLogic) logoutUnbind(userInfo *user.User, device *user.Devic } } + // 踢人者只需刷新缓存,不踢设备、不清 session + if memberID == kickerUserID { + continue + } + // 踢该成员的所有在线设备 var memberDevices []user.Device l.svcCtx.DB.WithContext(l.ctx).