2013-03-20 13 views
15
  • Python 3
  • Django 1.5
  • PostgreSQL 5.0.3

Jestem nowy Django & Robię aplikację Django, która korzysta z AbstractUser, ale kiedy utworzę użytkownika w administratorze Django, a potem przejrzę na dane użytkownika w administratorze, widzę hasło w postaci zwykłego tekstu. Sprawdzając bezpośrednio w DB, widzę, że hasło jest z pewnością przechowywane jako zwykły tekst.Django Admin nie Hashing klienta użytkownika Hasło

Próbuję napisać kilka widoków, aby wykonać pewne uwierzytelnienie, ale nie działa, nawet jeśli nazwa użytkownika i hasło są poprawne. Zgaduję więc, że funkcja authenticate() jest hashing, ale zwraca None, ponieważ hasło nie jest w rzeczywistości mieszane.

Czy istnieje jakiś powód, dla którego hasło nie jest hashowane?

będę pisać jakiś kod, ale nie sądzę, każdy kod pomoże, ponieważ mój model nie zawiera żadnego kodu, który robi coś z pola hasła (który jest generowany & wykonaną przez Django). Jeśli jest coś, co robię lub czego nie robię, nie wiedziałbym nawet, w której części kodu się znajduję, więc musiałbym opublikować wszystko z moich ustawień, modeli, administratora itp.

Odpowiedz

2

Ponieważ to bezpośrednio zapisać w bazie danych. Zanim więc zapiszesz, musisz zastąpić metodę haszowania hasła. Dodaj to w formularzu:

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 
+0

nie dokonały żadnych form (używam te generowane przez admin Django), więc nie bardzo rozumiem gdzie moja forma jest. Czy umieściłem to w moim admin.py? – Zamphatta

+0

nie musi być w oddzielnym pliku, nazwij go jako forms.py – catherine

8

Możesz dodać kod formularza do pliku admin.py. Będziesz jednak musiał dodać definicję klasy formularza, a nie tylko metodę save(), a także definicję klasy potomnej UserAdmin. Myślę, że przykład wyjaśni:

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) 

To powinno wystartować. Będziesz musiał dostosować pola klas, aby pasowały do ​​pól Twojej klasy użytkownika.

Więcej informacji jest tutaj: https://docs.djangoproject.com/en/dev/topics/auth/customizing/

8

Myślę, że problemem jest to, że odziedziczył ModelAdmin zamiast UserAdmin z django.contrib.auth.admin w admin.py.

Przykładowy kod:

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

class EmployeeAdmin(UserAdmin): 
    pass 

admin.site.register(Employee, EmployeeAdmin)