2016-07-05 13 views
0

Ich entschuldige mich, wenn es bereits eine substanzielle Antwort darauf gegeben hat, habe ich lange gesucht und kann keine hilfreichen Antworten finden.Benutzer erstellen und Passwort zurücksetzen in Django

Ich habe ein Django-Projekt, das verschiedene Ebenen des Kontozugriffs hat. Ich habe eine Gruppe von "Managern" und möchte ihnen erlauben, Benutzerkonten zu verwalten.

Ich möchte die Manager die Benutzerkontoobjekte für die Benutzer erstellen können. Ich möchte jedoch nicht, dass sie sich mit der Erstellung ihrer Passwörter befassen und sie (aus offensichtlichen Gründen) an die Benutzer senden müssen. Auf diese Weise können Manager die Identität von Benutzern übernehmen, um in ihrem Auftrag Arbeit zu erledigen, und die Benutzer behalten die Kontrolle über das Passwort und die Inhaberschaft ihrer Daten bei.

Die Idee ist, dass Manager das Konto erstellen, und wenn das Konto erstellt wird Benutzern ein Passwort-Reset-Formular (wie Django Out-of-Box-Auth), die ihnen ihre Kennwörter festlegen können gesendet werden.

Mein Code sieht unten auf ähnliche (entfällt nicht zwingend notwendig, Sachen)

from django.contrib.auth.models import User 
from django.contrib.auth.forms import PasswordResetForm 

@manager_required 
def manager_add_users(request): 
    add_user_form = manager_add_user_form(request.POST) 
    new_user_name = add_user_form.cleaned_data['user_name'] 
    new_user_email = add_user_form.cleaned_data['user_email'] 

    new_user = User.objects.create_user(
     username = new_user_name, 
     email = new_user_email, 
     ) 
    new_user.save() 

    set_password_form = PasswordResetForm({'email': new_user.email }) 
      if set_password_form.is_valid(): 
       print 'Reset Form Is Valid' 
       set_password_form.save(
        request= request, 
        use_https=True, 
        from_email="[email protected]", 
        email_template_name='registration/password_reset_email.html') 

Das Konto schafft richtig und alles läuft ohne Fehler. Das Problem ist, dass, obwohl das Formular gültig ist (Reset-Formular ist eine gültige Anweisung druckt), es tatsächlich nicht das Reset-Formular sendet. Es gibt keine Formfehler.

jedoch in Tests, wenn ich initialisieren das Formular mit einer Adresse, wie dies in dem System bereits vorhanden ist:

set_password_form = PasswordResetForm({'email':'[email protected]'}) 

Das Passwort-Reset-Formular sendet, ohne Fehler. Es funktioniert also nur mit vorhandenen Benutzer-E-Mail-Adressen im System, aber obwohl der Benutzer erstellt wurde und die .save() -Methode aufgerufen wurde, fängt er es immer noch nicht ab (Die Benutzer werden bei der Erstellung als 'Aktiv' gekennzeichnet, sollten also sein) kann gefunden werden)

Ich bin ein bisschen ratlos. Ich kann mir einige Möglichkeiten vorstellen, wie ich dieses Problem lösen könnte, aber dies scheint der direkteste Weg zu sein und ich bin mir nicht ganz sicher, warum es nicht funktioniert.

Ja, ich kann Nachrichten senden. Ich benutze zum Testen Backend-Mail des django:

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' 
+0

Sie haben nichts über Ihr E-Mail-Backend erwähnt. Django selbst versendet keine E-Mails, Sie müssen einen E-Mail-Server konfigurieren. Wenn Tests ausgeführt werden, ersetzt es ein Dummy-Backend. Haben Sie einen E-Mail-Server eingerichtet und bestätigt, dass Sie tatsächlich E-Mails damit versenden können? –

+0

Entschuldigung. Ich benutze djangos Backend. Ich dachte, es wäre klar, dass ich einen Mail-Server konfiguriert hätte, als ich erwähnte, dass ich in einigen Testfällen erfolgreich Mails erhalten habe. Ich habe die Frage aktualisiert, um meine Einstellungen zu übernehmen. – rob

+0

Danke für die Klärung. Ich habe es erwähnt, weil Tests problemlos funktionieren können, ohne dass ein Mail-Server eingerichtet wurde, da Djangos Test-Runner ein Test-Backend ersetzt. –

Antwort

1

am source code Glancing, es sieht aus wie Django die Anforderung ignoriert, da das Kennwort leer ist.

Versuchen Sie, ein temporäres Passwort zu setzen (z. B. mit django.utils.crypto.get_random_string()), bevor Sie den Benutzer speichern.

+0

Senden von Passwörtern mit einer E-Mail ist eine schlechte Idee. Verwenden Sie die Dangoregistrierung, um Tokens zu generieren und stattdessen das Token zu senden. Sobald der Token aus der E-Mail geklickt wurde, lesen Sie ihn und bieten Sie dem Benutzer an, das Passwort festzulegen. – dmitryro

+1

@ dmitryro: Was Sie beschreiben, ist genau, wie Djangos Passwort Reset Flow funktioniert.Meine Antwort lautet: Setzen Sie * ein temporäres Passwort in der Datenbank, nicht * senden Sie es in einer E-Mail. –

+0

Danke. Dies ist die absolut richtige Antwort. Obwohl Benutzeraccounts, die ohne Passwörter erstellt wurden, aktiv waren und von Administratoren verfälscht werden konnten, verhinderte das Fehlen eines Passworts, dass Auth einen Reset schickte. Es scheint jetzt so offensichtlich! – rob

Verwandte Themen