Django - User と同じパスワードバリデーションを単体で使う
投稿日: 2023/01/18
更新日: 2023/01/18
更新日: 2023/01/18
概要
ユーザー以外のモデルにパスワードを設定したい。
そのパスワードを設定する時に 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',
},
]