33
  • 蟒蛇 3
  • 姜戈 1.5
  • PostgreSQL 5.0.3

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

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

密码没有被哈希处理有什么可能的原因吗?

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

4

3 回答 3

39

我想问题是你从 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)
于 2015-09-04T06:05:13.527 回答
14

您可以将表单代码添加到 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/

于 2013-04-03T04:40:26.587 回答
0

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

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
于 2013-03-20T04:25:54.507 回答