login_log.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import enum
  2. from sqlalchemy import Column, Integer, String, Enum, DateTime, ForeignKey, Text
  3. from sqlalchemy.sql import func
  4. from app.core.database import Base
  5. class LoginMethod(str, enum.Enum):
  6. UNIFIED_PAGE = "UNIFIED_PAGE" # 统一认证自有页面
  7. CUSTOM_PAGE = "CUSTOM_PAGE" # 用户自定义登录页面
  8. DIRECT_JUMP = "DIRECT_JUMP" # 统一认证平台直接跳转
  9. INTER_PLATFORM = "INTER_PLATFORM" # 平台间相互跳转
  10. UNKNOWN = "UNKNOWN"
  11. class AuthType(str, enum.Enum):
  12. PASSWORD = "PASSWORD" # 账号密码
  13. SMS = "SMS" # 短信验证码
  14. TICKET = "TICKET" # 票据置换
  15. TOKEN = "TOKEN" # Token 验证
  16. SSO = "SSO" # 单点登录
  17. OTHER = "OTHER"
  18. class LoginLog(Base):
  19. __tablename__ = "login_logs"
  20. id = Column(Integer, primary_key=True, index=True)
  21. # User Info
  22. user_id = Column(Integer, ForeignKey("users.id"), nullable=True) # Maybe null if login failed
  23. mobile = Column(String(20), nullable=True, index=True)
  24. # Network Info
  25. ip_address = Column(String(50), nullable=True)
  26. location = Column(String(100), nullable=True) # e.g. "Shanghai, China"
  27. user_agent = Column(Text, nullable=True)
  28. # Context
  29. login_method = Column(Enum(LoginMethod), default=LoginMethod.UNIFIED_PAGE, nullable=False)
  30. auth_type = Column(Enum(AuthType), default=AuthType.PASSWORD, nullable=False)
  31. # Status
  32. is_success = Column(Integer, default=1) # 1: Success, 0: Failed
  33. failure_reason = Column(String(255), nullable=True)
  34. created_at = Column(DateTime(timezone=True), server_default=func.now(), index=True)