Требование минимальной сложности пароля в django allauth
Я пытаюсь внедрить минимальный набор критериев для паролей. Однако даже при соблюдении указанных ниже требований пользователи могут регистрироваться с паролем из одного символа. Как я могу потребовать определенную минимальную сложность пароля при использовании django-allauth с пользовательским адаптером
# adapter.py
from typing import Any
from allauth.account.adapter import DefaultAccountAdapter
from allauth.socialaccount.adapter import DefaultSocialAccountAdapter
from allauth.exceptions import ImmediateHttpResponse
from django.conf import settings
from django.forms import ValidationError
from django.http import HttpRequest
class AccountAdapter(DefaultAccountAdapter):
def is_open_for_signup(self, request: HttpRequest):
return getattr(settings, "ACCOUNT_ALLOW_REGISTRATION", True)
def clean_password(self, password, user=None):
special_characters = "[~\!@#\$%\^&\*\(\)_\+{}\":;'\[\]]"
min_length = 1
if len(password) < 8:
raise ValidationError('Password length must be greater than 8 characters.')
if not any(char.isdigit() for char in password):
raise ValidationError('Password must contain at least %(min_length)d digits.') % {'min_length': min_length}
if not any(char.isalpha() for char in password):
raise ValidationError('Password must contain at least %(min_length)d letters.') % {'min_length': min_length}
if not any(char in special_characters for char in password):
raise ValidationError('Password must contain at least %(min_length)d special characters.') % {'min_length': min_length}
return password
class SocialAccountAdapter(DefaultSocialAccountAdapter):
def is_open_for_signup(self, request: HttpRequest, sociallogin: Any):
return getattr(settings, "ACCOUNT_ALLOW_REGISTRATION", True)
# settings.py
# https://django-allauth.readthedocs.io/en/latest/configuration.html
ACCOUNT_ADAPTER = "project.adapters.user.AccountAdapter"
# https://django-allauth.readthedocs.io/en/latest/forms.html
ACCOUNT_FORMS = {"signup": "project.forms.user.UserSignupForm"}
# https://django-allauth.readthedocs.io/en/latest/configuration.html
SOCIALACCOUNT_ADAPTER = "project.adapters.user.SocialAccountAdapter"
Я смог решить проблему, не используя адаптер, а поместив это в файл forms.py
def clean_password(self):
special_characters = "[~\!@#\$%\^&\*\(\)_\+{}\":;'\[\]]"
if len(self.data['password']) < 8:
raise ValidationError('Password length must be greater than 8 characters.')
if not any(char.isdigit() for char in self.data['password']):
raise ValidationError('Password must contain at least 1 digit.')
if not any(char.isalpha() for char in self.data['password']):
raise ValidationError('Password must contain at least 1 letter.')
if not any(char in special_characters for char in self.data['password']):
raise ValidationError('Password must contain at least 1 special characters.')
return self.data['password']