从 AbstractUser 继承的模型不散列密码字段

Posted

技术标签:

【中文标题】从 AbstractUser 继承的模型不散列密码字段【英文标题】:Model inherited from AbstractUser doesn't hash password field 【发布时间】:2013-02-28 22:18:02 【问题描述】:

我有一个继承自 AbstractUser 的模型,如下所示:

class Driver(AbstractUser):
  dni = models.CharField(max_length=8,validators=[validate_dni],unique=True)
  license = models.CharField(max_length=9,unique=True)
  birthday = models.DateField()
  sex = models.CharField(max_length=1, choices=SEX_CHOICES)
  creation_date = models.DateField(auto_now = True)

据此:https://docs.djangoproject.com/en/dev/topics/auth/customizing/

如果您对 Django 的 User 模型非常满意,并且只想 添加一些额外的配置文件信息,您可以简单地子类化 django.contrib.auth.models.AbstractUser 并添加您的自定义配置文件 字段。此类提供默认的完整实现 用户作为抽象模型。

但是,在我的管理员视图中,密码字段是简单的文本输入,密码保存为原始文本。我可以尝试使用 AbstractBaseUser 但首先我需要澄清这个问题。我是从 Django 开始的,所以我是一个小新手。

谢谢。

【问题讨论】:

【参考方案1】:

您不必实际定义自己的函数。您只需使用 django.contrib.auth.admin 中的 UserAdmin 类注册它,它就可以开箱即用。

明确地,在您的 admin.py 文件中确保您具有以下内容:

from django.contrib.auth.admin import UserAdmin
admin.site.register(CustomUserModel, UserAdmin)

如果您的模型上有其他自定义字段,上述注册方式将使它们不会显示在管理员中。在这种情况下,您可以通过使您的自定义 Admin 类继承自 UserAdmin 类来使其工作,如下所示:

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin

@admin.register(CustomUserModel)
class CustomUserModelAdmin(UserAdmin):
    ...

【讨论】:

当我使用UserAdmin 注册它时,我的自定义选项消失了。知道为什么吗? 是的,管理类指定出现哪些字段等。您可以创建一个继承自 UserAdmin 并包含您的自定义字段的新类。然后使用您的自定义用户模型注册新的管理类。 添加此行 admin.site.register(CustomUserModel, UserAdmin) 后,我的自定义字段从管理员中消失 我也有同样的事情 @mr_bulrathi:我更新了答案以包含一个带有自定义管理模型的示例,这是您需要做的才能使密码散列正确并显示您的自定义字段。 【参考方案2】:

您需要定义一个函数来散列该密码。我认为您直接将其保存到数据库中。

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

【讨论】:

谢谢,它有效。我认为没有必要编辑保存方法或显式调用“set_password”方法。【参考方案3】:

程序 djnago >=3.0

models.py

from django.db import models
from django.contrib.auth.models import AbstractUser

    YEAR_IN_SCHOOL_CHOICES = [('1', '1 class'),('2', '2 class'),('3', '3 class'),('4', '4 class'),('5', '5 class'),('6', '6 class'),('7', '7 class'),('8', '8 class'),('9', '9 class'),('10', '10th class'),]
    
    class User(AbstractUser):
        type = models.CharField(max_length=256, choices=(('1','Student'), ('2','Professor'), ('3','lower_staf')), default='1')  
    
    
    class Student(models.Model):
        user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True )
        gender = models.BooleanField(choices=((1,'Male'), (2,'Female'), (3,'Trans')), 
    
        def __str__(self):
            return ''.format(self.user)

admin.py

from django.contrib import admin
from.models import User, Student
from django.contrib.auth.admin import UserAdmin

class CustomUserAdmin(UserAdmin):

    fieldsets = UserAdmin.fieldsets + ((None, 'fields': ('type',)),)
    add_fieldsets = UserAdmin.add_fieldsets + ((None, 'fields': ('type',)),)

class Student_admin(admin.ModelAdmin):
    pass

admin.site.register(User, CustomUserAdmin)
admin.site.register(Student, Student_admin)

【讨论】:

以上是关于从 AbstractUser 继承的模型不散列密码字段的主要内容,如果未能解决你的问题,请参考以下文章

Django用户继承AbstractUser后密码为明文

Django用户继承AbstractUser后密码为明文

django - 继承 AbstractUser 明文 问题处理

无法更新自定义用户 (AbstractUser)

要散列还是不散列?

Django-models,继承AbstractUser类