2010-01-08 17 views
8

Pracuję nad projektem w django, który wymaga oddzielnych grup użytkowników w ich własnej przestrzeni nazw username.Django - zezwalaj na zduplikowane nazwy użytkowników

Na przykład mogę mieć wiele "organizacji", a username powinna być unikalna w ramach tej organizacji.

Wiem, że mogę to zrobić za pomocą innego modelu, który zawiera identyfikator nazwa użytkownika/organizacji, ale nadal pozostawia to bezużyteczne (i wymagane) pole na defesst django auth User, że będę musiał wypełnić coś.

Pisałem już przez własny serwer uwierzytelniający, który uwierzytelnia użytkownika przed LDAP. Jednak, jak wspomniałem wcześniej, wciąż mam problem z zapełnianiem/ignorowaniem pola username dla domyślnego użytkownika django.

Czy istnieje sposób na usunięcie ograniczenia unikalności dla użytkownika auth Django dla użytkownika username?

Odpowiedz

7

Nie jestem pewien, czy jest to dokładnie to, czego szukasz, ale myślę, że możesz użyć haka podobnego do tego, co jest w this answer.

Poniższy kod działa tak długo, jak długo znajduje się w miejscu, które zostanie wykonane po załadowaniu modeli przez Django.

from django.contrib.auth.models import User 

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

pamiętać, że nie zmieni bazy unique na stole auth_user jeśli został już utworzony. Dlatego musisz dokonać tej zmiany przed możesz uruchomić syncdb. Ewentualnie, jeśli nie chcesz odtworzyć tabeli auth_user, możesz wprowadzić tę zmianę, a następnie ręcznie zmienić tabelę bazy danych, aby usunąć ograniczenie.

+1

Nie jestem pewien, czy to zadziała. Atrybut 'unique' jest propagowany do bazy danych jako ograniczenie w tym polu. Gdy to zrobisz, poprawianie metadanych Django nie pomoże. Jeśli nigdy nie zamierzasz używać * (to znaczy wyświetlać/modyfikować) nazwy użytkownika, wystarczy, aby wszystko było unikatowe. Na przykład. co sugeruje DrBloodmoney. –

+0

To * działa * (próbowałem), ale ponieważ uzyskuje dostęp do '_meta', polega na wewnętrznej implementacji, a nie na udokumentowanym interfejsie, więc nie chcę go używać. +1, ale działa. –

+0

Cóż, działa na ograniczeniach NOT NULL (próbowałem), więc nie widzę, dlaczego nie. Dopóki "MyUserModel" jest klasą dziedziczącą po "auth.User", a linia jest umieszczana bezpośrednio po modelu, wydaje się, że działa. Chodzi o to, że to trochę brzydki hack. –

1

Nie osobiście musiałem znaleźć rozwiązanie tego problemu, ale jednym ze sposobów rozwiązania tego problemu (z perspektywy SAAS) byłoby przedrostek nazwy użytkownika identyfikatorem organizacyjnym (zakładającym unikalne organizacje). Na przykład: subdomain.twojawitryna.com będzie oznaczać użytkownika z nazwą użytkownika: subdomain_username. Wystarczy, że wpiszesz logikę biznesową podczas logowania do poddomeny, aby dodać ją do nazwy użytkownika.

+1

Tak, to działa i rozważałem, ale nazwa użytkownika ma już tylko 30 znaków, a dodanie prefiksu szybko zmniejsza rozmiar do czegoś, co jest bezużyteczne. –

5

Co można zrobić, to rozszerzyć model użytkownika. W przypadku tabeli użytkownika wygeneruj nazwę użytkownika (np. A_123, A_345), która nie będzie wyświetlana w ogóle w witrynie.

Następnie utwórz nowy model, który rozszerza użytkownika.

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

Następnie należy utworzyć niestandardowy mechanizm uwierzytelniania, który używa AppUser zamiast obiektu User.

0

Mam do czynienia z tym samym problemem i dużo czytałem (o tym, jak rozwiązać ten problem w 1.5) i właśnie pomyślałem o znacznie prostszym rozwiązaniu. Co się stanie, jeśli dodasz przedrostek o stałej długości z identyfikatorem organizacji, aby zapisać nazwę użytkownika?

tj. Identyfikator organizacji = 115, wybrana nazwa użytkownika = "john" i stała długość 6. Tak więc w bazie danych przechowujesz nazwę użytkownika "000115_john".

Po zalogowaniu uzyskuje się połączenie dwóch parametrów i uwierzytelnianie za pomocą tego, co zapewnia Django. Nie jestem pewien, czy ustalona długość jest absolutnie niezbędna, ale może uniknąć niepożądanych rezultatów, jeśli użytkownik wybierze nazwę użytkownika zawierającą tylko liczby.

+1

Jeśli chcesz odpowiedzi, opublikuj to jako pytanie. – Marcin

Powiązane problemy