簡體   English   中英

Django AbstractUser 密碼未散列

[英]Django AbstractUser password is not hashing

我已用作由自定義字段擴展的 model AbstractUser ,由ModelForm自動創建表單。 問題是,除了超級用戶之外的用戶無法登錄系統。 我認為這是原因,他們的密碼沒有散列。 我應該在哪里做? 這是我的代碼。

forms.py

class CustomUserSignUpForm(ModelForm):
    class Meta:
        model = CustomUser
        fields = ['username', 'password', 'user_image', 'role', 'branch', 'license_number', 'fin_number', 'first_name', 'last_name', 'patronymic', 'phone_number', 'email', 'voen_number', 'is_active']

views.py

def sign_up(request):
    if request.method == 'POST':
        form = CustomUserSignUpForm(request.POST)
        if form.is_valid():
            form.save()
    else:
        form = CustomUserSignUpForm()

    context = {
        'form': form,
    }

    return render(request, 'sign_up.html', context)

models.py

class CustomUser(AbstractUser):
    patronymic = models.CharField(_('Ata adı'), max_length=150, blank=True)
    role = models.ForeignKey(Role, on_delete=models.CASCADE, blank=True, null=True)
    user_image = models.FileField(_('Profil şəkli'), upload_to='static/assets/images/user-images', blank=True)
    branch = models.ForeignKey(Branch, on_delete=models.CASCADE, blank=True, null=True)
    phone_number = models.CharField(_('Telefon'), max_length=20, blank=True)
    voen_number = models.CharField(_('VÖEN'), max_length=30, blank=True)
    fin_number = models.CharField(_('FİN'), max_length=20, blank=True)
    license_number = models.CharField(_('Lisenziya'), max_length=40, blank=True)

    def __str__(self):
        return self.username

要定義 function 到 hash 該密碼,您必須為您的用戶表單繼承保存方法

    class CustomUserSignUpForm(forms.ModelForm):
    ............
    def save(self, commit=True):
        # Save the provided password in hashed format
        user = super(CustomUserSignUpForm, self).save(commit=False)
        user.set_password(self.cleaned_data["password"])
        if commit:
            user.save()
        return user

這種對 ModelForm 的覆蓋更好,因為:
我檢查用戶是否存在。
如果密碼未編碼,則 I Hash de 密碼。

class UsuarioAdmin(admin.ModelAdmin):
...

def save_model(self, request, obj, form, change):
    try:
        user_database = USUARIO.objects.get(pk=obj.pk)
    except Exception:
        user_database = None
    if user_database is None \
            or not (check_password(form.data['password'], user_database.password)
                    or user_database.password == form.data['password']):
        obj.password = make_password(obj.password)
    else:
        obj.password = user_database.password
    super().save_model(request, obj, form, change)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM