Spec-Zone.ru › Django 5.2

Управление паролями в Django

Управление паролями — это то, что обычно не стоит изобретать заново, и Django стремится предоставить набор безопасных и гибких инструментов для управления паролями пользователей. Этот документ описывает, как Django хранит пароли, как можно настроить хэширование хранения и какие утилиты используются для работы с хэшированными паролями.

См. также

Даже если пользователи используют сложные пароли, злоумышленники могут перехватывать их подключения. Используйте HTTPS, чтобы избегать отправки паролей (или любых других конфиденциальных данных) по обычным HTTP-соединениям, так как они будут уязвимы к перехвату паролей.

Как Django хранит пароли

Django предоставляет гибкую систему хранения паролей и по умолчанию использует PBKDF2.

Атрибут password объекта User — это строка в таком формате:

<algorithm>$<iterations>$<salt>$<hash>

Это компоненты, используемые для хранения пароля пользователя, разделенные символом «доллар»: алгоритм хэширования, количество итераций алгоритма (фактор сложности), случайный соль и полученный хэш пароля. Алгоритм — один из нескольких односторонних алгоритмов хэширования или хранения паролей, которые может использовать Django; см. ниже. Итерации описывают количество раз, которое алгоритм выполняется над хэшем. Соль — это случайное начальное значение, а хэш — результат односторонней функции.

По умолчанию Django использует алгоритм PBKDF2 с хэшем SHA256, механизм расширения пароля, рекомендуемый NIST. Это должно быть достаточно для большинства пользователей: он довольно безопасен, требуя огромного количества вычислительных ресурсов для взлома.

Однако в зависимости от ваших потребностей вы можете выбрать другой алгоритм или даже использовать пользовательский алгоритм, соответствующий вашей конкретной ситуации безопасности. Опять же, большинству пользователей это не нужно — если вы не уверены, вам, вероятно, не нужно. Если вы уверены, читайте дальше:

Django выбирает используемый алгоритм, обращаясь к настройке PASSWORD_HASHERS. Это список классов алгоритмов хэширования, которые поддерживаются этой установкой Django.

Для хранения паролей Django будет использовать первый хэшер в PASSWORD_HASHERS. Для хранения новых паролей с другим алгоритмом поместите предпочитаемый алгоритм первым в PASSWORD_HASHERS.

Для проверки паролей Django найдет хэшер в списке, который соответствует имени алгоритма в сохраненном пароле. Если сохраненный пароль называет алгоритм, которого нет в PASSWORD_HASHERS, попытка его проверки вызовет ValueError.

Значение по умолчанию для PASSWORD_HASHERS:

PASSWORD_HASHERS = [
    "django.contrib.auth.hashers.PBKDF2PasswordHasher",
    "django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher",
    "django.contrib.auth.hashers.Argon2PasswordHasher",
    "django.contrib.auth.hashers.BCryptSHA256PasswordHasher",
    "django.contrib.auth.hashers.ScryptPasswordHasher",
]

Это означает, что Django будет использовать PBKDF2 для хранения всех паролей, но будет поддерживать проверку паролей, сохранённых с PBKDF2SHA1, argon2 и bcrypt.

В следующих разделах описаны несколько распространенных способов, которыми продвинутые пользователи могут изменить эту настройку.

Использование Argon2 с Django

Argon2 — победитель конкурса 2015 года по хэшированию паролей Password Hashing Competition, организованного сообществом, для выбора алгоритма хэширования следующего поколения. Он разработан таким образом, чтобы его вычисление на специализированном оборудовании не было проще, чем на обычном процессоре. По умолчанию для хэшера паролей Argon2 используется вариант Argon2id.

Argon2 не является значением по умолчанию для Django, поскольку он требует сторонней библиотеки. Однако панель конкурса по хэшированию паролей рекомендует немедленное использование Argon2 вместо других поддерживаемых Django алгоритмов.

Чтобы использовать Argon2id в качестве алгоритма хранения по умолчанию, выполните следующие действия:

  1. Установите пакет argon2-cffi. Это можно сделать, выполнив команду python -m pip install django[argon2], что эквивалентно python -m pip install argon2-cffi (вместе с любыми требованиями к версии из pyproject.toml Django).
  2. Измените PASSWORD_HASHERS, чтобы список начинался с Argon2PasswordHasher. То есть в вашем файле настроек вы бы записали:

    PASSWORD_HASHERS = [
        "django.contrib.auth.hashers.Argon2PasswordHasher",
        "django.contrib.auth.hashers.PBKDF2PasswordHasher",
        "django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher",
        "django.contrib.auth.hashers.BCryptSHA256PasswordHasher",
        "django.contrib.auth.hashers.ScryptPasswordHasher",
    ]
    

    Сохраните и/или добавьте любые записи в этот список, если вам нужно, чтобы Django обновлял пароли.

Использование bcrypt с Django

Bcrypt — популярный алгоритм хранения паролей, специально разработанный для долгосрочного хранения паролей. Он не является значением по умолчанию, используемым Django, так как требует использования сторонних библиотек, но так как многие пользователи могут захотеть его использовать, Django поддерживает bcrypt с минимальными усилиями.

Чтобы использовать Bcrypt в качестве алгоритма хранения по умолчанию, выполните следующие действия:

  1. Установите пакет bcrypt. Это можно сделать, выполнив команду python -m pip install django[bcrypt], что эквивалентно python -m pip install bcrypt (вместе с любыми требованиями к версии из pyproject.toml Django).
  2. Измените PASSWORD_HASHERS, чтобы список начинался с BCryptSHA256PasswordHasher. То есть в вашем файле настроек вы бы записали:

    PASSWORD_HASHERS = [
        "django.contrib.auth.hashers.BCryptSHA256PasswordHasher",
        "django.contrib.auth.hashers.PBKDF2PasswordHasher",
        "django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher",
        "django.contrib.auth.hashers.Argon2PasswordHasher",
        "django.contrib.auth.hashers.ScryptPasswordHasher",
    ]
    

    Сохраните и/или добавьте любые записи в этот список, если вам нужно, чтобы Django обновлял пароли.

Всё — теперь ваша установка Django будет использовать Bcrypt в качестве алгоритма хранения по умолчанию.

Использование scrypt с Django

scrypt похож на PBKDF2 и bcrypt в использовании заданного числа итераций для замедления атак грубой силы. Однако, поскольку PBKDF2 и bcrypt не требуют большого объема памяти, злоумышленники с достаточными ресурсами могут запускать масштабные параллельные атаки для ускорения процесса атаки. scrypt специально разработан для использования большего объема памяти по сравнению с другими функциями вывода ключа на основе паролей, чтобы ограничить количество параллелизма, которое может использовать злоумышленник, см. RFC 7914 для получения дополнительной информации.

Чтобы использовать scrypt в качестве алгоритма хранения по умолчанию, выполните следующие действия:

  1. Измените PASSWORD_HASHERS, чтобы список начинался с ScryptPasswordHasher. То есть в вашем файле настроек:

    PASSWORD_HASHERS = [
        "django.contrib.auth.hashers.ScryptPasswordHasher",
        "django.contrib.auth.hashers.PBKDF2PasswordHasher",
        "django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher",
        "django.contrib.auth.hashers.Argon2PasswordHasher",
        "django.contrib.auth.hashers.BCryptSHA256PasswordHasher",
    ]
    

    Сохраните и/или добавьте любые записи в этот список, если вам нужно, чтобы Django обновлял пароли.

Примечание

scrypt требует OpenSSL 1.1+.

Увеличение энтропии соли

Большинство хэшей паролей включают соль вместе с хэшем пароля для защиты от атак с использованием радужных таблиц. Сама соль — это случайное значение, которое увеличивает размер и, следовательно, стоимость радужной таблицы и в настоящее время установлена на 128 бит с значением salt_entropy в BasePasswordHasher. По мере снижения вычислительных и хранилищных затрат это значение следует повышать. При реализации собственного хэшера паролей вы можете переопределить это значение, чтобы использовать желаемый уровень энтропии для хэшей паролей. salt_entropy измеряется в битах.

Детали реализации

Из-за метода хранения значений соли значение salt_entropy фактически является минимальным значением. Например, значение 128 обеспечит соль, которая фактически будет содержать 131 бит энтропии.

Увеличение фактора работы алгоритма

PBKDF2 и bcrypt

Алгоритмы PBKDF2 и bcrypt используют определённое количество итераций или раундов хеширования. Это намеренно замедляет атакующих, делая атаки на хешированные пароли сложнее. Однако, с ростом вычислительной мощности, количество итераций необходимо увеличивать. Мы выбрали разумное значение по умолчанию (и будем увеличивать его с каждым выпуском Django), но вы можете настроить его вверх или вниз в зависимости от ваших потребностей в безопасности и доступной вычислительной мощности. Для этого вы создадите подкласс соответствующего алгоритма и переопределите параметр iterations (используйте параметр rounds при создании подкласса хешера bcrypt). Например, чтобы увеличить количество итераций, используемых алгоритмом PBKDF2 по умолчанию:

  1. Создайте подкласс django.contrib.auth.hashers.PBKDF2PasswordHasher

    from django.contrib.auth.hashers import PBKDF2PasswordHasher
    
    
    class MyPBKDF2PasswordHasher(PBKDF2PasswordHasher):
        """
        A subclass of PBKDF2PasswordHasher that uses 100 times more iterations.
        """
    
        iterations = PBKDF2PasswordHasher.iterations * 100
    

    Сохраните его где-нибудь в своём проекте. Например, вы можете поместить его в файл, такой как myproject/hashers.py.

  2. Добавьте ваш новый хешер как первый элемент в PASSWORD_HASHERS:

    PASSWORD_HASHERS = [
        "myproject.hashers.MyPBKDF2PasswordHasher",
        "django.contrib.auth.hashers.PBKDF2PasswordHasher",
        "django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher",
        "django.contrib.auth.hashers.Argon2PasswordHasher",
        "django.contrib.auth.hashers.BCryptSHA256PasswordHasher",
        "django.contrib.auth.hashers.ScryptPasswordHasher",
    ]
    

Всё – теперь ваш установленный Django будет использовать больше итераций при хранении паролей с помощью PBKDF2.

Примечание

У bcrypt rounds является логарифмическим фактором работы, например, 12 раундов означают 2 ** 12 итераций.

Argon2

У Argon2 есть следующие атрибуты, которые можно настроить:

  1. time_cost контролирует количество итераций в хеше.
  2. memory_cost контролирует размер памяти, который необходимо использовать во время вычисления хеша.
  3. parallelism контролирует, на скольких процессорах вычисление хеша может быть распараллелено.

Значения этих атрибутов по умолчанию, вероятно, подойдут вам. Если вы определите, что хеш пароля слишком быстрый или слишком медленный, вы можете настроить его следующим образом:

  1. Выберите parallelism, чтобы это было количеством потоков, которые вы можете использовать для вычисления хеша.
  2. Выберите memory_cost, чтобы это было количеством Кбайт памяти, которое вы можете использовать.
  3. Настройте time_cost и измерьте время, необходимое для хеширования пароля. Выберите time_cost, которое займёт приемлемое время для вас. Если time_cost, установленный в 1, неприемлемо медленно, уменьшите memory_cost.

memory_cost интерпретация

Утилита Argon2 для командной строки и некоторые другие библиотеки интерпретируют параметр memory_cost по-другому, чем использует Django. Преобразование задаётся выражением memory_cost == 2 ** memory_cost_commandline.

scrypt

scrypt имеет следующие атрибуты, которые можно настроить:

  1. work_factor контролирует количество итераций в хеше.
  2. block_size
  3. parallelism контролирует количество потоков, которые будут выполняться параллельно.
  4. maxmem ограничивает максимальный размер памяти, который может быть использован во время вычисления хеша. По умолчанию установлено 0, что означает стандартное ограничение из библиотеки OpenSSL.

Мы выбрали разумные значения по умолчанию, но вы можете настроить их вверх или вниз в зависимости от ваших потребностей в безопасности и доступной вычислительной мощности.

Оценка использования памяти

Минимальное требование к памяти scrypt:

work_factor * 2 * block_size * 64

поэтому вам может потребоваться настроить maxmem при изменении значений work_factor или block_size.

Обновление паролей

При входе пользователей, если их пароли хранятся с использованием алгоритма отличного от предпочтительного, Django автоматически обновит алгоритм до предпочтительного. Это означает, что старые установки Django станут автоматически более безопасными при каждом входе пользователя, а также это означает, что вы можете переключиться на новые (и лучшие) алгоритмы хранения, по мере их изобретения.

Однако Django может обновлять только пароли, которые используют алгоритмы, упомянутые в PASSWORD_HASHERS, поэтому при обновлении до новых систем вам следует убедиться, что вы никогда не удаляете элементы из этого списка. Если вы это сделаете, пользователи, использующие неуказанные алгоритмы, не смогут обновить пароли. Хешированные пароли будут обновлены при увеличении (или уменьшении) количества итераций PBKDF2, раундов bcrypt или атрибутов argon2.

Обратите внимание, что если все пароли в вашей базе данных не закодированы в алгоритме хешера по умолчанию, вы можете быть уязвимы для атаки на перечисление пользователей с помощью тайминга из-за различия между продолжительностью запроса входа в систему для пользователя с паролем, закодированным в алгоритме, отличном от стандартного, и продолжительностью запроса входа в систему для несуществующего пользователя (который использует стандартный хешер). Вы можете смягчить это, обновив старые хеши паролей.

Обновление паролей без требования входа

Если у вас есть существующая база данных со старым, слабым хешем, таким как MD5, вы можете обновить эти хеши самостоятельно, вместо того, чтобы ждать обновления при входе пользователя (что может никогда не произойти, если пользователь не возвращается на ваш сайт). В этом случае вы можете использовать «обёрнутый» хешер паролей.

В этом примере мы мигрируем набор хешей MD5 для использования PBKDF2(MD5(пароль)) и добавим соответствующий хешер паролей для проверки, ввёл ли пользователь правильный пароль при входе. Мы предполагаем, что мы используем встроенную модель User и что наш проект имеет приложение accounts. Вы можете изменить шаблон, чтобы он работал с любым алгоритмом или с пользовательской моделью.

Сначала мы добавим пользовательский хешер:

accounts/hashers.py
from django.contrib.auth.hashers import (
    PBKDF2PasswordHasher,
    MD5PasswordHasher,
)


class PBKDF2WrappedMD5PasswordHasher(PBKDF2PasswordHasher):
    algorithm = "pbkdf2_wrapped_md5"

    def encode_md5_hash(self, md5_hash, salt, iterations=None):
        return super().encode(md5_hash, salt, iterations)

    def encode(self, password, salt, iterations=None):
        _, _, md5_hash = MD5PasswordHasher().encode(password, salt).split("$", 2)
        return self.encode_md5_hash(md5_hash, salt, iterations)

Миграция данных может выглядеть примерно так:

accounts/migrations/0002_migrate_md5_passwords.py
from django.db import migrations

from ..hashers import PBKDF2WrappedMD5PasswordHasher


def forwards_func(apps, schema_editor):
    User = apps.get_model("auth", "User")
    users = User.objects.filter(password__startswith="md5$")
    hasher = PBKDF2WrappedMD5PasswordHasher()
    for user in users:
        algorithm, salt, md5_hash = user.password.split("$", 2)
        user.password = hasher.encode_md5_hash(md5_hash, salt)
        user.save(update_fields=["password"])


class Migration(migrations.Migration):
    dependencies = [
        ("accounts", "0001_initial"),
        # replace this with the latest migration in contrib.auth
        ("auth", "####_migration_name"),
    ]

    operations = [
        migrations.RunPython(forwards_func),
    ]

Обратите внимание, что эта миграция может занять несколько минут для нескольких тысяч пользователей, в зависимости от скорости вашего оборудования.

Наконец, мы добавим настройку PASSWORD_HASHERS:

mysite/settings.py
PASSWORD_HASHERS = [
    "django.contrib.auth.hashers.PBKDF2PasswordHasher",
    "accounts.hashers.PBKDF2WrappedMD5PasswordHasher",
]

В этот список включите любые другие хешеры, которые использует ваш сайт.

Включенные хешеры

Полный список хешеров, включённых в Django:

[
    "django.contrib.auth.hashers.PBKDF2PasswordHasher",
    "django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher",
    "django.contrib.auth.hashers.Argon2PasswordHasher",
    "django.contrib.auth.hashers.BCryptSHA256PasswordHasher",
    "django.contrib.auth.hashers.BCryptPasswordHasher",
    "django.contrib.auth.hashers.ScryptPasswordHasher",
    "django.contrib.auth.hashers.MD5PasswordHasher",
]

Соответствующие имена алгоритмов:

  • pbkdf2_sha256
  • pbkdf2_sha1
  • argon2
  • bcrypt_sha256
  • bcrypt
  • scrypt
  • md5

Написание собственного хешера паролей

Если вы пишете собственный хешер паролей, содержащий фактор работы, например, количество итераций, вы должны реализовать метод harden_runtime(self, password, encoded), чтобы устранить разрыв во времени выполнения между фактором работы, предоставленным в encoded паролем, и фактором работы по умолчанию хешера. Это предотвращает атаку на перечисление пользователей по таймингу из-за разницы между запросом входа в систему для пользователя с паролем, закодированным в более старом количестве итераций, и несуществующим пользователем (который использует количество итераций по умолчанию стандартного хешера).

Принимая PBKDF2 в качестве примера, если encoded содержит 20 000 итераций, а значение по умолчанию iterations хешера равно 30 000, метод должен выполнить password дополнительных 10 000 итераций PBKDF2.

Если ваш хешер не имеет фактора работы, реализуйте метод как no-op (pass).

Ручное управление паролем пользователя

Модуль django.contrib.auth.hashers предоставляет набор функций для создания и проверки хэшированных паролей. Вы можете использовать их независимо от модели User.

check_password(password, encoded, setter=None, preferred='default') [source]
acheck_password(password, encoded, asetter=None, preferred='default')

Асинхронная версия: acheck_password()

Если вы хотите вручную аутентифицировать пользователя, сравнивая текстовый пароль с хэшированным паролем в базе данных, используйте удобную функцию check_password(). Она принимает два обязательных аргумента: текстовый пароль для проверки и полное значение поля пользователя password в базе данных для сравнения. Она возвращает True, если они совпадают, и False в противном случае. Дополнительно, вы можете передать вызываемый объект setter, который принимает пароль и будет вызван при необходимости его перегенерации. Вы также можете передать preferred для изменения алгоритма хэширования, если вы не хотите использовать по умолчанию (первый элемент в настройке PASSWORD_HASHERS). См. Включённые хэширования для имени алгоритма каждого хэшера.

make_password(password, salt=None, hasher='default') [source]

Создаёт хэшированный пароль в формате, используемом этим приложением. Она принимает один обязательный аргумент: пароль в текстовом виде (строка или байты). Дополнительно, вы можете указать соль и алгоритм хэширования для использования, если вы не хотите использовать значения по умолчанию (первый элемент в настройке PASSWORD_HASHERS). См. Включённые хэширования для имени алгоритма каждого хэшера. Если аргумент password является None, возвращается непригодный пароль (который никогда не будет принят функцией check_password()).

is_password_usable(encoded_password) [source]

Возвращает False, если пароль является результатом вызова User.set_unusable_password().

Валидация паролей

Пользователи часто выбирают слабые пароли. Чтобы смягчить эту проблему, Django предоставляет возможность подключаемой валидации паролей. Вы можете настроить несколько валидаторов паролей одновременно. В Django включены несколько валидаторов, но вы также можете написать свои собственные.

Каждый валидатор паролей должен предоставить подсказку для пользователя, объясняя требования, валидировать предоставленный пароль и возвращать сообщение об ошибке, если он не соответствует требованиям, а также (необязательно) определить обратный вызов для уведомления при изменении пароля пользователя. Валидаторы также могут иметь необязательные параметры для настройки их поведения.

Валидация управляется настройкой AUTH_PASSWORD_VALIDATORS. По умолчанию для этой настройки установлено пустое значение, что означает, что валидаторы не применяются. В новых проектах, созданных с помощью шаблона по умолчанию startproject, набор валидаторов включен по умолчанию.

По умолчанию валидаторы используются в формах для сброса или изменения паролей, а также в командной оболочке управления createsuperuser и changepassword. Валидаторы не применяются на уровне модели, например, в User.objects.create_user() и create_superuser(), потому что мы предполагаем, что разработчики, а не пользователи, взаимодействуют с Django на этом уровне, а также потому, что валидация модели не выполняется автоматически как часть создания моделей.

Примечание

Валидация паролей может предотвратить использование многих типов слабых паролей. Однако тот факт, что пароль прошёл все валидаторы, не гарантирует, что он является надёжным. Существует много факторов, которые могут ослабить пароль, которые не обнаруживаются даже самыми продвинутыми валидаторами паролей.

Включение валидации паролей

Валидация паролей настраивается в настройке AUTH_PASSWORD_VALIDATORS:

AUTH_PASSWORD_VALIDATORS = [
    {
        "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator",
    },
    {
        "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",
        "OPTIONS": {
            "min_length": 9,
        },
    },
    {
        "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator",
    },
    {
        "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",
    },
]

В этом примере включены все четыре включенных валидатора:

  • UserAttributeSimilarityValidator, который проверяет сходство пароля с набором атрибутов пользователя.
  • MinimumLengthValidator, который проверяет, соответствует ли пароль минимальной длине. Этот валидатор настроен с помощью пользовательского параметра: теперь минимальная длина должна быть девять символов вместо стандартных восьми.
  • CommonPasswordValidator, который проверяет, содержится ли пароль в списке общих паролей. По умолчанию он сравнивается со включённым списком из 20 000 общих паролей.
  • NumericPasswordValidator, который проверяет, не является ли пароль полностью числовым.

Для UserAttributeSimilarityValidator и CommonPasswordValidator в этом примере используются настройки по умолчанию. NumericPasswordValidator не имеет настроек.

Подсказки и любые ошибки от валидаторов паролей всегда возвращаются в порядке их перечисления в AUTH_PASSWORD_VALIDATORS.

Включенные валидаторы

Django включает четыре валидатора:

class MinimumLengthValidator(min_length=8) [source]

Проверяет, что длина пароля не менее минимальной. Минимальная длина может быть настроена с помощью параметра min_length.

get_error_message() [source]
Добавлен в Django 5.2.

Способ настройки сообщения об ошибке ValidationError. По умолчанию это "This password is too short. It must contain at least <min_length> characters.".

get_help_text() [source]

Способ настройки подсказки валидатора. По умолчанию это "Your password must contain at least <min_length> characters.".

class UserAttributeSimilarityValidator(user_attributes=DEFAULT_USER_ATTRIBUTES, max_similarity=0.7) [source]

Проверяет, что пароль достаточно отличается от определённых атрибутов пользователя.

Параметр user_attributes должен быть итерируемым списком имён атрибутов пользователя для сравнения. Если этот аргумент не указан, используется значение по умолчанию: 'username', 'first_name', 'last_name', 'email'. Несуществующие атрибуты игнорируются.

Максимально допустимое сходство паролей можно установить в диапазоне от 0,1 до 1,0 с помощью параметра max_similarity. Это сравнивается с результатом difflib.SequenceMatcher.quick_ratio(). Значение 0,1 отклоняет пароли, если они существенно отличаются от значения user_attributes, в то время как значение 1,0 отклоняет только пароли, идентичные значению атрибута.

get_error_message() [source]
Добавлен в Django 5.2.

Способ настройки сообщения об ошибке ValidationError. По умолчанию это "The password is too similar to the <user_attribute>.".

get_help_text() [source]

Способ настройки подсказки валидатора. По умолчанию это "Your password can’t be too similar to your other personal information.".

class CommonPasswordValidator(password_list_path=DEFAULT_PASSWORD_LIST_PATH) [source]

Проверяет, что пароль не является общим паролем. Преобразует пароль в нижний регистр (для выполнения сравнения без учёта регистра) и проверяет его по списку из 20 000 общих паролей, созданных Royce Williams.

Параметр password_list_path может быть установлен на путь к пользовательскому файлу общих паролей. Этот файл должен содержать по одному паролю в нижнем регистре на строке и может быть текстовым или сжатым в формате gzip.

get_error_message() [source]
Добавлен в Django 5.2.

Способ настройки сообщения об ошибке ValidationError. По умолчанию это "This password is too common.".

get_help_text() [source]

Способ настройки подсказки валидатора. По умолчанию это "Your password can’t be a commonly used password.".

class NumericPasswordValidator [source]

Проверяет, что пароль не состоит целиком из цифр.

get_error_message() [source]
Добавлен в Django 5.2.

Способ настройки сообщения об ошибке ValidationError. По умолчанию это "This password is entirely numeric.".

get_help_text() [source]

Способ настройки подсказки валидатора. По умолчанию это "Your password can’t be entirely numeric.".

Интеграция валидации

В модуле django.contrib.auth.password_validation есть несколько функций, которые можно вызвать из собственных форм или другого кода для интеграции валидации паролей. Это может быть полезно, если вы используете пользовательские формы для установки паролей или если у вас есть вызовы API, которые позволяют устанавливать пароли, например.

validate_password(password, user=None, password_validators=None) [source]

Проверяет пароль. Если все валидаторы считают пароль действительным, возвращает None. Если один или несколько валидаторов отклоняют пароль, генерирует исключение ValidationError со всеми сообщениями об ошибках от валидаторов.

Объект user является необязательным: если он не предоставлен, некоторые валидаторы могут не иметь возможности выполнить проверку и примут любой пароль.

password_changed(password, user=None, password_validators=None) [source]

Сообщает всем валидаторам, что пароль был изменён. Это может использоваться валидаторами, например, которые предотвращают повторное использование паролей. Этот метод должен быть вызван после успешной смены пароля.

Для подклассов AbstractBaseUser, поле пароля помечается как «изменённое» при вызове set_password(), что запускает вызов password_changed() после сохранения пользователя.

password_validators_help_texts(password_validators=None) [source]

Возвращает список текстов подсказок всех валидаторов. Они объясняют требования к паролю пользователю.

password_validators_help_text_html(password_validators=None)

Возвращает строку HTML со всеми текстами подсказок в <ul>. Это полезно при добавлении валидации паролей в формы, так как вы можете передать вывод непосредственно в параметр help_text поля формы.

get_password_validators(validator_config) [source]

Возвращает набор объектов валидаторов на основе параметра validator_config. По умолчанию все функции используют валидаторы, определённые в AUTH_PASSWORD_VALIDATORS, но вызвав эту функцию с альтернативным набором валидаторов и передав результат в параметр password_validators других функций, вместо этого будет использован ваш пользовательский набор. Это полезно, когда у вас есть типичный набор валидаторов для большинства сценариев, но также есть специальная ситуация, требующая пользовательского набора. Если вы всегда используете один и тот же набор валидаторов, нет необходимости использовать эту функцию, так как конфигурация из AUTH_PASSWORD_VALIDATORS используется по умолчанию.

Структура validator_config идентична структуре AUTH_PASSWORD_VALIDATORS. Возвращаемое значение этой функции можно передать в параметр password_validators перечисленных выше функций.

Обратите внимание, что при передаче пароля в одну из этих функций, это всегда должен быть текстовый пароль — не хэшированный.

Написание собственного валидатора

Если встроенные валидаторы Django недостаточно, вы можете написать свои собственные валидаторы паролей. У валидаторов довольно небольшой интерфейс. Они должны реализовать два метода:

  • validate(self, password, user=None): валидирует пароль. Возвращает None, если пароль действителен, или генерирует исключение ValidationError с сообщением об ошибке, если пароль не действителен. Вы должны уметь обрабатывать ситуацию, когда user является None — если это означает, что ваш валидатор не может работать, верните None для отсутствия ошибок.
  • get_help_text(): предоставляет текст подсказки для объяснения требований пользователю.

Любые элементы в OPTIONS в AUTH_PASSWORD_VALIDATORS для вашего валидатора будут переданы в конструктор. Все аргументы конструктора должны иметь значение по умолчанию.

Вот пример базового валидатора с одним необязательным параметром:

from django.core.exceptions import ValidationError
from django.utils.translation import gettext as _


class MinimumLengthValidator:
    def __init__(self, min_length=8):
        self.min_length = min_length

    def validate(self, password, user=None):
        if len(password) < self.min_length:
            raise ValidationError(
                _("This password must contain at least %(min_length)d characters."),
                code="password_too_short",
                params={"min_length": self.min_length},
            )

    def get_help_text(self):
        return _(
            "Your password must contain at least %(min_length)d characters."
            % {"min_length": self.min_length}
        )

Вы также можете реализовать password_changed(password, user=None), который будет вызван после успешного изменения пароля. Это можно использовать, например, для предотвращения повторного использования паролей. Однако, если вы решите хранить предыдущие пароли пользователя, никогда не делайте этого в виде открытого текста.

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/5.2/topics/auth/passwords/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API