From 07bba946ac7ff1d1a9cf94432d26b0b08d9ec666 Mon Sep 17 00:00:00 2001 From: dangzerong <429714019@qq.com> Date: Tue, 18 Nov 2025 16:07:50 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=99=BB=E5=BD=95=E6=97=B6?= =?UTF-8?q?=E9=82=AE=E7=AE=B1=E5=A4=A7=E5=B0=8F=E5=86=99=E6=95=8F=E6=84=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/apps/user_app_fastapi.py | 7 ++++--- api/db/services/user_service.py | 22 ++++++++++++++++++++-- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/api/apps/user_app_fastapi.py b/api/apps/user_app_fastapi.py index 6e4d9e9..0cefc5c 100644 --- a/api/apps/user_app_fastapi.py +++ b/api/apps/user_app_fastapi.py @@ -125,12 +125,13 @@ async def login(request: LoginRequest): """ 用户登录端点 """ - email = request.email - users = UserService.query(email=email) + raw_email = (request.email or "").strip() + email = raw_email.lower() + users = UserService.query_user_by_email_insensitive(raw_email) if not users: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, - detail=f"Email: {email} is not registered!" + detail=f"Email: {raw_email} is not registered!" ) password = request.password diff --git a/api/db/services/user_service.py b/api/db/services/user_service.py index 00fb837..a1c8a57 100644 --- a/api/db/services/user_service.py +++ b/api/db/services/user_service.py @@ -18,6 +18,7 @@ from datetime import datetime import logging import peewee +from peewee import fn from werkzeug.security import generate_password_hash, check_password_hash from api.db import UserTenantRole @@ -93,8 +94,15 @@ class UserService(CommonService): Returns: User object if authentication successful, None otherwise. """ - user = cls.model.select().where((cls.model.email == email), - (cls.model.status == StatusEnum.VALID.value)).first() + normalized_email = (email or "").strip().lower() + user = ( + cls.model.select() + .where( + fn.Lower(cls.model.email) == normalized_email, + cls.model.status == StatusEnum.VALID.value + ) + .first() + ) if user and check_password_hash(str(user.password), password): return user else: @@ -106,6 +114,16 @@ class UserService(CommonService): users = cls.model.select().where((cls.model.email == email)) return list(users) + @classmethod + @DB.connection_context() + def query_user_by_email_insensitive(cls, email): + normalized_email = (email or "").strip().lower() + users = ( + cls.model.select() + .where(fn.Lower(cls.model.email) == normalized_email) + ) + return list(users) + @classmethod @DB.connection_context() def save(cls, **kwargs):