Przeglądaj źródła

解决登录IP异常问题

liuq 2 miesięcy temu
rodzic
commit
5e213adf68

+ 5 - 5
backend/app/api/v1/endpoints/simple_auth.py

@@ -8,7 +8,7 @@ from pydantic import BaseModel
 from app.api.v1 import deps
 from app.core import security
 from app.core.config import settings
-from app.core.utils import generate_english_name
+from app.core.utils import generate_english_name, get_client_ip
 from app.models.user import User, UserRole, UserStatus
 from app.models.application import Application
 from app.models.mapping import AppUserMapping
@@ -46,7 +46,7 @@ def login_with_password(
         # Prepare Log
         log_create = LoginLogCreate(
             mobile=req.identifier,
-            ip_address=request.client.host,
+            ip_address=get_client_ip(request),
             login_method=LoginMethod.UNIFIED_PAGE,
             auth_type=AuthType.PASSWORD,
             user_agent=request.headers.get("user-agent")
@@ -102,7 +102,7 @@ def login_with_password(
     # --- App SSO Login ---
     log_create = LoginLogCreate(
         mobile=req.identifier,
-        ip_address=request.client.host,
+        ip_address=get_client_ip(request),
         login_method=LoginMethod.CUSTOM_PAGE, # 假设应用自定义页面调用此接口
         auth_type=AuthType.PASSWORD,
         user_agent=request.headers.get("user-agent")
@@ -268,7 +268,7 @@ def admin_reset_password(
         action_type=ActionType.RESET_PASSWORD,
         target_user_id=target_user.id,
         target_mobile=target_user.mobile,
-        ip_address=request.client.host,
+        ip_address=get_client_ip(request),
         details={}
     )
 
@@ -441,7 +441,7 @@ def sso_login(
     
     # Prepare Log
     log_create = LoginLogCreate(
-        ip_address=request.client.host,
+        ip_address=get_client_ip(request),
         login_method=LoginMethod.DIRECT_JUMP,
         auth_type=AuthType.SSO,
         user_agent=request.headers.get("user-agent"),

+ 2 - 1
backend/app/api/v1/endpoints/sms_auth.py

@@ -6,6 +6,7 @@ from datetime import timedelta
 from app.api.v1 import deps
 from app.core import security
 from app.core.config import settings
+from app.core.utils import get_client_ip
 from app.core.cache import redis_client
 from app.models.user import User, UserStatus
 from app.services.sms_service import SmsService
@@ -79,7 +80,7 @@ def login_with_sms(
     # Log preparation
     log_create = LoginLogCreate(
         mobile=mobile,
-        ip_address=request.client.host,
+        ip_address=get_client_ip(request),
         login_method=LoginMethod.UNIFIED_PAGE,
         auth_type=AuthType.SMS,
         user_agent=request.headers.get("user-agent")

+ 6 - 6
backend/app/api/v1/endpoints/users.py

@@ -6,7 +6,7 @@ from sqlalchemy.exc import IntegrityError
 
 from app.api.v1 import deps
 from app.core import security
-from app.core.utils import generate_english_name
+from app.core.utils import generate_english_name, get_client_ip
 from app.models.user import User, UserRole
 from app.models.mapping import AppUserMapping
 from app.schemas.user import User as UserSchema, UserCreate, UserUpdate, UserList, PromoteUserRequest, BatchResetEnglishNameRequest
@@ -175,7 +175,7 @@ def create_user(
         action_type=ActionType.MANUAL_ADD,
         target_user_id=db_user.id,
         target_mobile=db_user.mobile,
-        ip_address=request.client.host,
+        ip_address=get_client_ip(request),
         details={"role": db_user.role}
     )
 
@@ -245,7 +245,7 @@ def batch_reset_english_name(
                 action_type=ActionType.UPDATE,
                 target_user_id=user.id,
                 target_mobile=user.mobile,
-                ip_address=request.client.host,
+                ip_address=get_client_ip(request),
                 details={
                     "field": "english_name", 
                     "old": old_english_name, 
@@ -396,7 +396,7 @@ def update_user(
                 action_type=action_type,
                 target_user_id=user.id,
                 target_mobile=user.mobile,
-                ip_address=request.client.host,
+                ip_address=get_client_ip(request),
                 details=details
             )
 
@@ -445,7 +445,7 @@ def promote_user(
         action_type=ActionType.CHANGE_ROLE,
         target_user_id=user.id,
         target_mobile=user.mobile,
-        ip_address=request.client.host,
+        ip_address=get_client_ip(request),
         details={"old": old_role, "new": "SUPER_ADMIN"}
     )
     
@@ -487,7 +487,7 @@ def delete_user(
         action_type=ActionType.DELETE,
         target_user_id=user.id,
         target_mobile=user.mobile,
-        ip_address=request.client.host,
+        ip_address=get_client_ip(request),
         details={"status": "DISABLED"}
     )
     

+ 15 - 0
backend/app/core/utils.py

@@ -1,4 +1,5 @@
 from xpinyin import Pinyin
+from fastapi import Request
 
 def generate_english_name(chinese_name: str) -> str:
     """
@@ -19,3 +20,17 @@ def generate_english_name(chinese_name: str) -> str:
     
     return f"{surname_pinyin}{firstname_initial}"
 
+def get_client_ip(request: Request) -> str:
+    """
+    Get client IP address from request headers or fallback to client host.
+    Prioritizes X-Forwarded-For and X-Real-IP headers.
+    """
+    forwarded_for = request.headers.get("X-Forwarded-For")
+    if forwarded_for:
+        return forwarded_for.split(",")[0].strip()
+    
+    real_ip = request.headers.get("X-Real-IP")
+    if real_ip:
+        return real_ip
+        
+    return request.client.host if request.client else "0.0.0.0"