/
Roman88
/
contact_manager
Обзор
Документация
Войти
/
Roman88
/
contact_manager
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/models/user.py
133 строки
5 KB
Roman88
16-05
16 май 2026, 10:00
16 май 2026, 10:00
d98539b
Код
Авторство
О чём код?
""" Модель пользователя системы. Эта модель представляет зарегистрированного пользователя, содержит логин и хеш пароля. Пароли хранятся в хешированном виде с использованием bcrypt для безопасности. """ import datetime from peewee import Model, AutoField, CharField, DateTimeField import bcrypt from src.connection.connect import db class User(Model): """ Модель пользователя системы Атрибуты: id (int): Уникальный идентификатор пользователя (автоматически) login (str): Логин пользователя (уникальный, макс. 100 символов) password_hash (str): Хеш пароля пользователя (макс. 255 символов) created_at (datetime): Дата и время регистрации (автоматически) Методы: set_password(password): Хеширует и сохраняет пароль с помощью bcrypt check_password(password): Проверяет соответствие пароля Пример: >>> user = User() >>> user.login = "alice" >>> user.set_password("my_secret_pass") >>> user.save() >>> user.check_password("my_secret_pass") True """ class Meta: """ Внутренний класс Meta настройки модели Peewee. Указывает, к какой базе данных и таблице относится модель. """ database = db # Используем подключение из connect.py table_name = 'users' # Имя таблицы в БД # Поля таблицы id = AutoField(primary_key=True, verbose_name="Идентификатор") """Уникальный идентификатор пользователя""" login = CharField( max_length=100, unique=True, # Запрещаем одинаковые логины null=False, # Не может быть пустым verbose_name="Логин" ) """Логин пользователя (должен быть уникальным)""" password_hash = CharField( max_length=255, null=False, verbose_name="Хеш пароля" ) """Хеш пароля пользователя (хранится в зашифрованном виде с помощью bcrypt)""" created_at = DateTimeField( default=datetime.datetime.now, verbose_name="Дата регистрации" ) """Дата и время создания учётной записи""" def set_password(self, password: str) -> None: """ Хеширует пароль с помощью bcrypt и сохраняет в password_hash. Процесс хеширования: 1. Генерируется уникальная соль (bcrypt делает это автоматически) 2. Пароль хешируется с солью 3. Хеш сохраняется в базу данных Аргументы: password (str): Пароль в открытом виде Пример: >>> user = User() >>> user.set_password("qwerty123") >>> user.password_hash '$2b$12$...' """ if not password or len(password) < 6: raise ValueError("Пароль должен быть не менее 6 символов") # Генерируем соль и хешируем пароль # rounds=12 - хороший баланс безопасности и производительности salt = bcrypt.gensalt(rounds=12) self.password_hash = bcrypt.hashpw( password.encode('utf-8'), salt ).decode('utf-8') def check_password(self, password: str) -> bool: """ Проверяет, соответствует ли переданный пароль сохранённому хешу. Аргументы: password (str): Пароль для проверки в открытом виде Возвращает: bool: True если пароль верный, False в противном случае Пример: >>> user = User.get_by_id(1) >>> if user.check_password("qwerty123"): ... print("Доступ разрешён") """ if not password or not self.password_hash: return False try: # bcrypt.checkpw автоматически извлекает соль из хеша return bcrypt.checkpw( password.encode('utf-8'), self.password_hash.encode('utf-8') ) except Exception: return False def __str__(self) -> str: """Строковое представление пользователя""" return f"User(id={self.id}, login='{self.login}')" def __repr__(self) -> str: """Подробное строковое представление для отладки""" return f"<User id={self.id} login='{self.login}' created_at={self.created_at}>"