Django - User と同じパスワードバリデーションを単体で使う

投稿日: 2023/01/18
更新日: 2023/01/18
シェア:

URL copied!


概要

ユーザー以外のモデルにパスワードを設定したい。
そのパスワードを設定する時に User と同じバリデーションをかけたい。

ドキュメントを読む

Djangoにおけるパスワード管理 - Djangoをみていくと、 validate_password を使えば良いことがわかる。

ここに書いてあるが、userオブジェクトを指定しない場合、一部のバリデーションが働かないことがあるそうだ。これは AUTH_PASSWORD_VALIDATORS に設定した項目を理解している必要があるので使う場合は注意。

コード

あとからPWを設定するケース

from django.db import models

class Hoge(models.Model)
    ...
    password = models.CharField("パスワード", max_length=128, null=True)
    ...

    def set_password(self, raw_password):
        error_messages = []
        try:
            validate_password(raw_password)
        except ValidationError as e:
            error_messages += e
        else:
            self.password = make_password(raw_password)
            self.save()
        return error_messages

これを実行してみると

>>> obj = Hoge.objects.get(id=1)
>>> obj.set_password("1111")
['このパスワードは短すぎます。最低 8 文字以上必要です。', 'このパスワードは一般的すぎます。', 'このパスワードは数字しか使われていません。']
>>> obj.set_password("11111111")
['このパスワードは一般的すぎます。', 'このパスワードは数字しか使われていません。']
>>> obj.set_password("11111111abcd")
[]

※この時の設定は下記(デフォルト)

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]