Django Admin Not Hashing Пользовательский пароль пользователя - программирование

Django Admin Not Hashing Пользовательский пароль пользователя

  • Python 3
  • Django 1.5
  • PostgreSQL 5.0.3

Я новичок в Django, и я создаю приложение Django, которое использует AbstractUser, но когда я создаю пользователя в администраторе Django, а затем просматриваю информацию о пользователе в admin, я вижу пароль в простой текст. Проверка непосредственно в БД, я вижу, что пароль определенно хранится как открытый текст.

Я пытаюсь написать несколько просмотров, чтобы выполнить некоторую проверку подлинности, но не работает, даже когда правильное имя пользователя и пароль. Поэтому я предполагаю, что функция authenticate() является хешированием, но возвращает None, так как пароль на самом деле не хэширован.

Есть ли возможная причина, почему пароль не получает хеширование?

Я бы опубликовал код, но я не думаю, что какой-либо код поможет, так как моя модель не содержит никакого кода, который ничего не делает с полем пароля (созданным и выполняемым Django). Если что-то я делаю или не делаю, я даже не знаю, в какой части кода он будет, поэтому мне придется публиковать все из моих настроек, моделей, admin и т.д.

4b9b3361

Ответ 1

Вы можете добавить код формы в файл 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/

Ответ 2

Я думаю, проблема в том, что вы унаследовали ModelAdmin вместо UserAdmin из django.contrib.auth.admin в вашем admin.py.

Пример кода:

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

class EmployeeAdmin(UserAdmin):
    pass

admin.site.register(Employee, EmployeeAdmin)

Ответ 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