【问题标题】:Django Admin Not Hashing Custom User PasswordDjango 管理员没有散列自定义用户密码
【发布时间】:2013-03-09 00:54:19
【问题描述】:
  • Python 3
  • Django 1.5
  • PostgreSQL 5.0.3

我是 Django 新手,我正在制作一个使用 AbstractUser 的 Django 应用程序,但是当我在 Django 管理员中创建一个用户,然后在管理员中查看用户信息时,我看到了密码纯文本。直接在数据库中检查,我看到密码肯定是以明文形式存储的。

我正在尝试编写一些视图来进行一些身份验证,但即使用户名和密码正确,它也无法正常工作。所以我猜测authenticate() 函数正在散列,但返回None,因为密码实际上并没有散列。

密码没有得到哈希处理是否有任何可能的原因?

我会发布一些代码,但我认为任何代码都无济于事,因为我的模型不包含任何对密码字段执行任何操作的代码(由 Django 生成和完成)。如果有什么我在做或不做的事情,我什至不知道它会在代码的哪一部分,所以我必须从我的设置、模型、管理员等中发布所有内容。

【问题讨论】:

    标签: django python-3.x


    【解决方案1】:

    我猜问题是您在 admin.py 中从 django.contrib.auth.admin 继承了 ModelAdmin 而不是 UserAdmin。

    示例代码:

    from django.contrib.auth.admin import UserAdmin
    from .models import Employee
    
    class EmployeeAdmin(UserAdmin):
        pass
    
    admin.site.register(Employee, EmployeeAdmin)
    

    【讨论】:

    • 感谢您的有用回答。你能详细说明它们之间的区别吗?
    【解决方案2】:

    您可以将表单代码添加到 admin.py 文件中。但是,您还需要添加表单类的定义,而不仅仅是 save() 方法和 UserAdmin 子类的定义。我认为示例会澄清:

    class UserCreationForm(forms.ModelForm):
        class Meta:
            model = CustomUser
            fields = ('email',)
    
        def save(self, commit=True):
            # Save the provided password in hashed format
            user = super(UserCreationForm, self).save(commit=False)
            user.set_password(self.cleaned_data["password"])
            if commit:
                user.save()
            return user
    
    
    class CustomUserAdmin(UserAdmin):
        # The forms to add and change user instances
        add_form = UserCreationForm
        list_display = ("email",)
        ordering = ("email",)
    
        fieldsets = (
            (None, {'fields': ('email', 'password', 'first_name', 'last_name')}),
            )
        add_fieldsets = (
            (None, {
                'classes': ('wide',),
                'fields': ('email', 'password', 'first_name', 'last_name', 'is_superuser', 'is_staff', 'is_active')}
                ),
            )
    
        filter_horizontal = ()
    
        admin.site.register(CustomUser, CustomUserAdmin)
    

    这应该可以帮助您入门。您需要自定义类的字段以匹配您的用户类的字段。

    更多信息在这里:https://docs.djangoproject.com/en/dev/topics/auth/customizing/

    【讨论】:

      【解决方案3】:

      因为它直接保存在数据库中。因此,在保存之前,您必须覆盖散列密码的方法。在您的表单中添加:

      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
      

      【讨论】:

      • 我还没有制作任何表格(我使用的是 Django 管理员生成的表格),所以我不太明白我的表格在哪里。我要把它放在我的 admin.py 中吗?
      • 如果我不使用表单,如果我使用“CreateView”类来创建用户呢?
      猜你喜欢
      • 1970-01-01
      • 2016-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多