infrastructure.persistence.models.user¶
src.infrastructure.persistence.models.user
¶
User database model for authentication.
This module defines the User model for storing user account information.
Security
- password_hash: NEVER stores plaintext passwords (bcrypt hashed)
- is_verified: Email verification required before login
- failed_login_attempts: Track for account lockout
- locked_until: Temporary account lockout after failed attempts
Session Management
- session_tier: Role-based tier determining default session limit
- max_sessions: Admin override for session limit (None = use tier default)
Token Breach Rotation
- min_token_version: Per-user minimum acceptable token version Increment to invalidate all user's tokens (password change, security event)
Classes¶
User
¶
Bases: BaseMutableModel
User model for authentication and account management.
This model stores user credentials and account state. Users must verify their email before login (is_verified). Failed login attempts trigger temporary account lockout.
Security Features
- Email verification required (is_verified must be True)
- Password hashing (bcrypt, cost factor 12)
- Account lockout (5 failed attempts = 15 minute lockout)
- Active/inactive states (is_active)
Fields
id: UUID primary key (from BaseMutableModel) created_at: Timestamp when user registered (from BaseMutableModel) updated_at: Timestamp when user last updated (from BaseMutableModel) email: Unique email address (lowercase, indexed) password_hash: Bcrypt hashed password (NEVER plaintext) is_verified: Email verification status (blocks login if False) is_active: Account active status (deactivated users cannot login) failed_login_attempts: Counter for failed logins (resets on success) locked_until: Timestamp until which account is locked (nullable) session_tier: Role-based tier for session limits (basic, essential, plus, premium, pro) max_sessions: Admin override for session limit (nullable, None = use tier default) min_token_version: Per-user minimum token version (increment to invalidate user's tokens)
Indexes
- idx_users_email: (email) for login queries
- idx_users_is_verified: (is_verified) for filtering unverified users
Relationships
- refresh_tokens: One-to-many (cascade delete)
- email_verification_tokens: One-to-many (cascade delete)
- password_reset_tokens: One-to-many (cascade delete)
Example
Create user (via repository)¶
user = User( email="user@example.com", password_hash="$2b$12$...", # Bcrypt hash is_verified=False, is_active=True, failed_login_attempts=0, ) session.add(user) await session.commit()
Query user by email (login)¶
result = await session.execute( select(User) .where(User.email == "user@example.com") ) user = result.scalar_one_or_none()
Source code in src/infrastructure/persistence/models/user.py
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 | |