2010-01-08 10 views
8

Ich arbeite an einem Projekt in Django, die für separate Benutzergruppen in ihrem eigenen username Namespace erfordert.Django - Erlaube doppelte Benutzernamen

Zum Beispiel könnte ich mehrere "Organisationen" haben, und username sollte nur innerhalb dieser Organisation eindeutig sein müssen.

Ich weiß, dass ich dies tun kann, indem ich ein anderes Modell benutze, das einen Benutzernamen/eine Organisations-ID enthält, aber immer noch dieses nutzlose (und erforderliche) Feld auf der defualt django auth User, die ich mit etwas füllen müsste.

Ich habe bereits von eigenen Auth-Backend geschrieben, die einen Benutzer gegen LDAP authentifiziert. Wie ich bereits erwähnt habe, stehe ich jedoch immer noch vor dem Problem, das Feld username des Standard-Django-Benutzers zu füllen/zu ignorieren.

Gibt es eine Möglichkeit, die Eindeutigkeitseinschränkung für die username für Django Auth Benutzer zu löschen?

Antwort

7

Ich bin mir nicht sicher, ob dies genau das ist, wonach Sie suchen, aber ich denke, Sie könnten einen Hack verwenden, der dem ähnelt, was in this answer ist.

Der folgende Code funktioniert, solange er an einem Ort ist, der ausgeführt wird, wenn Django Ihre Modelle lädt.

from django.contrib.auth.models import User 

User._meta.get_field('username')._unique = False 

Beachten Sie, dass dies die Datenbank eindeutige Einschränkung auf der auth_user Tabelle nicht ändern, wenn es bereits erstellt wurde. Daher müssen Sie diese Änderung vornehmen vor Sie Syncdb ausführen. Wenn Sie die auth_user-Tabelle nicht neu erstellen möchten, können Sie diese Änderung auch manuell vornehmen und dann die Datenbanktabelle manuell ändern, um die Einschränkung zu entfernen.

+1

Ich bin mir nicht sicher, dass das funktionieren wird. Das Attribut 'unique' wird als Einschränkung für dieses Feld an die Datenbank weitergegeben. Sobald das erledigt ist, wird das Verbessern der Django-Metainformationen nicht helfen. Wenn Sie den Benutzernamen niemals * verwenden * (d. H. Anzeigen/ändern), reicht alles aus, um ihn eindeutig zu machen. Z.B. was DrBloodmoney vorschlägt. –

+0

Dieses * funktioniert * (ich habe es versucht), aber da es auf '_meta' zugreift, verlässt es sich auf die interne Implementierung und nicht auf die dokumentierte Schnittstelle, also bin ich vorsichtig, es zu benutzen. +1, aber es funktioniert. –

+0

Nun, es funktioniert auf NOT NULL Constraints (ich habe das versucht), also sehe ich nicht warum nicht. Solange "MyUserModel" eine Klasse ist, die von "auth.User" erbt und die Zeile direkt hinter dem Modell eingefügt wird, scheint dies zu funktionieren. Es ist nur ein leicht hässlicher Hack. –

1

Ich selbst war nicht verpflichtet, eine Lösung zu finden, aber eine Möglichkeit (aus Sicht von SAAS) wäre, dem Benutzernamen eine Organisationskennung voranzutreiben (unter der Annahme von eindeutigen Organisationen). Beispiel: subdomain.yoursite.com würde einem Benutzer mit dem Benutzernamen "subdomain_username" entsprechen. Sie müssten nur eine Geschäftslogik beim Anmelden in einer Subdomain codieren, um diese auf den Benutzernamen zu übertragen.

+1

Ja, das funktioniert, und ich dachte, aber der Benutzername ist bereits nur 30 Zeichen, und das Hinzufügen des Präfix reduziert schnell die Größe auf etwas, das unbrauchbar ist. –

5

Sie können das Benutzermodell erweitern. Generieren Sie für die Benutzertabelle einen Benutzernamen (z. B. A_123, A_345), der auf der Site überhaupt nicht angezeigt wird.

Dann erstellen Sie ein neues Modell, das Benutzer erweitert.

class AppUser(User): 
    username = models.CharField... 
    organization = models.CharField... 

Anschließend erstellen Sie eine Back-End-benutzerdefinierte Authentifizierung, die anstelle des Benutzerobjekt AppUser verwenden.

0

Ich bin mit genau dem gleichen Problem konfrontiert und habe viel gelesen (über die Lösung dieses Problems in 1.5) und ich dachte mir einfach eine viel einfachere Lösung aus. Was ist, wenn Sie einfach ein Präfix mit fester Länge mit der Organisations-ID hinzufügen, um den Benutzernamen zu speichern?

I.e. Organisations-ID = 115, ausgewählter Benutzername = "John" und eine feste Länge von 6. So speichern Sie in der Datenbank als Benutzername "000115_john".

Wenn Sie die Anmeldung vornehmen, verbinden Sie einfach die beiden Parameter und versuchen, sich mit dem zu authentifizieren, was Django bietet. Ich bin nicht sicher, ob die feste Länge unbedingt notwendig ist, aber könnte unerwünschte Ergebnisse vermeiden, wenn ein Benutzer einen Benutzernamen mit nur Zahlen wählt.

+1

Wenn du Antworten willst, poste das als Frage. – Marcin

Verwandte Themen