From 9f3673d812d106b50d601c5ff409f3a17717ae09 Mon Sep 17 00:00:00 2001 From: Wu Clan Date: Thu, 28 May 2026 10:25:43 +0800 Subject: [PATCH] Optimize user session logging and deletion (#1185) --- backend/common/socketio/server.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/backend/common/socketio/server.py b/backend/common/socketio/server.py index 64d62968..072040dd 100644 --- a/backend/common/socketio/server.py +++ b/backend/common/socketio/server.py @@ -37,6 +37,11 @@ async def connect(sid, environ, auth) -> bool: # 免授权直连 if token == settings.WS_NO_AUTH_MARKER: + if settings.ENVIRONMENT == 'prod': + log.error('WebSocket 连接失败:生产环境禁止免授权直连') + return False + await redis_client.set(f'{settings.TOKEN_ONLINE_REDIS_PREFIX}:sid:{sid}', session_uuid) + await redis_client.sadd(f'{settings.TOKEN_ONLINE_REDIS_PREFIX}:session:{session_uuid}', sid) await redis_client.sadd(settings.TOKEN_ONLINE_REDIS_PREFIX, session_uuid) return True @@ -47,6 +52,8 @@ async def connect(sid, environ, auth) -> bool: log.info(f'WebSocket 连接失败:{e!s}') return False + await redis_client.set(f'{settings.TOKEN_ONLINE_REDIS_PREFIX}:sid:{sid}', session_uuid) + await redis_client.sadd(f'{settings.TOKEN_ONLINE_REDIS_PREFIX}:session:{session_uuid}', sid) await redis_client.sadd(settings.TOKEN_ONLINE_REDIS_PREFIX, session_uuid) return True @@ -54,4 +61,13 @@ async def connect(sid, environ, auth) -> bool: @sio.event async def disconnect(sid) -> None: """Socket 断开连接事件""" - await redis_client.spop(settings.TOKEN_ONLINE_REDIS_PREFIX) + session_uuid = await redis_client.get(f'{settings.TOKEN_ONLINE_REDIS_PREFIX}:sid:{sid}') + if not session_uuid: + return + + session_key = f'{settings.TOKEN_ONLINE_REDIS_PREFIX}:session:{session_uuid}' + await redis_client.delete(f'{settings.TOKEN_ONLINE_REDIS_PREFIX}:sid:{sid}') + await redis_client.srem(session_key, sid) + if await redis_client.scard(session_key) == 0: + await redis_client.delete(session_key) + await redis_client.srem(settings.TOKEN_ONLINE_REDIS_PREFIX, session_uuid)