Django Admin Not Hashing Пользовательский пароль пользователя
- Python 3
- Django 1.5
- PostgreSQL 5.0.3
Я новичок в Django, и я создаю приложение Django, которое использует AbstractUser, но когда я создаю пользователя в администраторе Django, а затем просматриваю информацию о пользователе в admin, я вижу пароль в простой текст. Проверка непосредственно в БД, я вижу, что пароль определенно хранится как открытый текст.
Я пытаюсь написать несколько просмотров, чтобы выполнить некоторую проверку подлинности, но не работает, даже когда правильное имя пользователя и пароль. Поэтому я предполагаю, что функция authenticate()
является хешированием, но возвращает None
, так как пароль на самом деле не хэширован.
Есть ли возможная причина, почему пароль не получает хеширование?
Я бы опубликовал код, но я не думаю, что какой-либо код поможет, так как моя модель не содержит никакого кода, который ничего не делает с полем пароля (созданным и выполняемым Django). Если что-то я делаю или не делаю, я даже не знаю, в какой части кода он будет, поэтому мне придется публиковать все из моих настроек, моделей, admin и т.д.
Ответы
Ответ 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