6 Stimmen

E-Mail anstelle des Anmeldenamens in django verwenden

Erstens geht es hier nicht um die Frage, wie man sich mit einem E-Mail/Passwort-Paar authentifizieren kann, sondern vielmehr darum, wie man eine logische und, wenn Sie so wollen, schöne Datenstruktur erzeugt.

Ich möchte E-Mails als Benutzernamen in einem bestimmten Django-Projekt zu verwenden. Allerdings bin ich nicht in der Lage, Felder wiederverwenden, die von auth.User Modell aus mindestens zwei Gründen:

  1. Das Feld max_length von auth.User.username hat eine Länge von 30 Zeichen, was für einige E-Mail-Adressen möglicherweise nicht ausreicht.

  2. auth.User.email ist nicht eindeutig - das ist offensichtlich nicht zufriedenstellend für eine Voraussetzung, die besagt, dass Benutzernamen eindeutig sein müssen.

Ein naheliegender Weg ist hier also, den Benutzernamen in einem benutzerdefinierten Profil zu speichern, das mit auth.User verknüpft ist. In diesem Fall müssen wir mit folgenden Problemen umgehen:

  1. Eindeutigen Benutzernamen für auth.User.username generieren - md5-Hash der E-Mail sollte hier ausreichen?
  2. Lassen Sie auth.User.email komplett leer - da es nur 75 Zeichen lang ist, während laut RFC 5321 ( Wie lang darf eine gültige E-Mail-Adresse maximal sein? ) E-Mail kann bis zu 256 Zeichen lang sein.

Die folgende Problematik ergibt sich aus der vorgeschlagenen Lösung:

  1. Es ist nicht möglich, integrierte Ansichten/Vorlagen für Standardvorgänge wie das Zurücksetzen von Passwörtern usw. wiederzuverwenden.
  2. Im Falle einer E-Mail-Änderung muss auth.User.username aktualisiert werden

Um noch Öl ins Feuer zu gießen, ist es unwahrscheinlich, dass die Django-Entwickler diese Einschränkung in absehbarer Zeit beheben werden - siehe http://code.djangoproject.com/ticket/11365

Die Frage ist also: Gibt es eine andere Möglichkeit, dies zu tun, und sehen Sie irgendwelche anderen Nachteile in der oben vorgeschlagenen Lösung?

Merci !

5voto

Peter Rowell Punkte 17345

Ich hatte einen Kunden mit einer kommerziellen Website, die seit 1995 in Betrieb war (ja, wir sprechen hier von Early Adopters). Jedenfalls hatten sie bereits einen festen Nutzerstamm und die Namen waren völlig nicht mit Djangos Vorstellung von einem Benutzernamen übereinstimmt.

Ich habe mir ein paar Möglichkeiten angesehen, wie man damit umgehen kann, und sie kamen mir alle wie Hacks vor (das war im Sommer 2007), also habe ich gesagt: "Scheiß drauf" und contrib.auth.models.User direkt gehackt. Ich musste nur etwa 10 Zeilen Code ändern, die Feldgröße erhöhen und den Validator optimieren. Seitdem haben wir zwei Upgrades durchgeführt -- 0.97-pre => 1.0, und 1.0 => 1.1.1 -- und es hat jedes Mal nur etwa 15 Minuten gedauert, den Hack zu portieren".

Es ist nicht schön, und ich werde vielleicht in der Hölle schmoren, weil ich es so gemacht habe, aber es hat weniger Zeit gekostet, es so zu machen, als alles andere, was ich herausfinden konnte, und die vorderen Ports waren ein totales Problem.

1voto

kemar Punkte 520

1voto

Micah Carrick Punkte 9627

Ich habe eine Erklärung zu meiner Lösung für das gleiche Problem verfasst: Django-Authentifizierung mit einer E-Mail Adresse . Sie besteht im Wesentlichen aus:

  • Erstellen Sie ein benutzerdefiniertes Autorisierungs-Backend für die E-Mail-Authentifizierung.
  • Unterklasse des Formulars zur Benutzererstellung, um die E-Mail-Adresse als erforderliches Feld hinzuzufügen.
  • Blenden Sie das Feld für den Benutzernamen in den Erstellungs- und Anmeldeformularen aus.
  • Generieren Sie einen Benutzernamen nach dem Zufallsprinzip in der Ansicht, die das Erstellungsformular verarbeitet.
  • Manuelles Hinzufügen eines eindeutigen Indexes für die E-Mail-Spalte (Igitt!)

Bei meiner Lösung gibt es noch 2 Probleme. Erstens ist das manuelle Erstellen eines Datenbankindexes nicht gut. Zweitens ist die E-Mail immer noch auf die 75 Zeichen begrenzt (ich hatte keine Probleme bei der Portierung eines Systems mit etwa 8.000 Benutzern). Aber, es spielt ziemlich gut mit dem Rest von Django und 3rd-Party-Anwendungen.

0voto

Filip Dupanović Punkte 30692

Auch ich muss gestehen, dass ich in der Hölle schmoren werde. Ich habe vor kurzem eine kleine Anwendung implementiert, bei der ich die E-Mail des Benutzers auf 30 Zeichen gekürzt und als Benutzernamen festgelegt habe. Ich dachte Zum Teufel, wie hoch sind die Chancen? und hat es durchgezogen. Es brauchte nur ein paar Zeilen Code und voila.

Ich denke, die Obergrenze von 75 Zeichen wurde so festgelegt, weil die Leute in der Regel haben keine so langen persönlichen E-Mails. Das ist nur eine Frage der Platzersparnis, denn all diese ungenutzten Bytes werden ohnehin reserviert (d.h. NULL und kürzere/kleinere Werte sind nicht frei).

0voto

Ich benutze einfach dieses djangosnippet und die Nutzer können entweder ihren Benutzernamen oder ihre E-Mail-Adresse verwenden.
Damit wird aber die 75-Zeichen-Grenze nicht aufgehoben, sondern nur ein praktischer Ausschnitt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X