2010-10-26 4 views
6

Ich möchte eine zweite Admin-Site implementieren, die eine Teilmenge der Funktion der primären Admin-Site bietet. Das ist möglich und beschrieben in der Django docsWie kann man die Django-Admin-Seite für Nicht-Mitarbeiter zugänglich machen?

Allerdings möchte ich den Zugriff auf die primäre Admin-Site beschränken. Einige Benutzer können auf die 2ndary-Site, nicht aber auf die primäre Site zugreifen.

Um diese Funktion zu implementieren, würde ich diesen Benutzer möchte nicht in dem Personal zu sein (is_staff = False) und schreibe die AdminSite.has_permission

class SecondaryAdminSite(AdminSite): 

    def has_permission(self, request): 
     if request.user.is_anonymous: 
      try: 
       username = request.POST['username'] 
       password = request.POST['password'] 
      except KeyError: 
       return False 
      try: 
       user = User.objects.get(username = username) 
       if user.check_password(password): 
        return user.has_perm('app.change_onlythistable') 
       else: 
        return False 
      except User.DoesNotExist: 
       return False 
     else: 
      return request.user.has_perm('app.change_onlythistable') 

Leider ist dieser Ansatz nicht funktioniert. Der Benutzer kann sich anmelden, kann jedoch auf der sekundären Verwaltungssite nichts sehen.

Was ist falsch an diesem Ansatz? Haben Sie eine Idee, wie Sie diese Funktion implementieren?

Vielen Dank im Voraus

+0

Warum partitionieren Sie Ihre Benutzer nicht in Superusers, Manager, Kunden usw. - Berechtigungssystem funktioniert perfekt. –

+0

@Tomasz: Ich mache das auch. Die 2ndary-Admin-Site hat einen anderen Zweck, also unterschiedliche Arten von Benutzern. Ich möchte vermeiden, dass sie sich mit dem üblichen Admin verbinden. – luc

+0

Ich nehme an, du verifizierst, dass die richtige 'has_permission' aufgerufen wird? Wird auf der Seite überhaupt nichts angezeigt (d. H. Es ist vollständig leer) oder werden die Verwaltungsfunktionen einfach ausgeblendet? –

Antwort

2

Ich denke, dass Ihr Ansatz jetzt möglich sein sollte: http://code.djangoproject.com/ticket/14434 (geschlossen vor 5 Wochen)

jedoch die explizite „is_staff“ Kontrolle ist noch an zwei Stellen durchgeführt (abgesehen von der staff_member_required Dekorateur):

  • django.contrib.admin.forms.AdminAuthenticationForm.clean()

    Oberhalb von "has_permission()" müssen Sie Ihrer nicht-administrativen AdminSite eine "login_form" geben, die die is_staff-Prüfung nicht durchführt, also könnten Sie clean() entsprechend unterklassen und anpassen.

  • templates/admin/base.html

    brauchen würde leicht angepasst werden. Das div mit ID "user-tools" wird nur für aktive Mitarbeiter angezeigt. Ich nehme an, dass das erledigt ist, weil das Anmeldeformular diese Vorlage auch verwendet, und jemand könnte als aktives Nicht-Mitarbeiter-Mitglied angemeldet sein, aber diese Links immer noch nicht sehen.

+0

Danke für diese Info, ich werde es versuchen – luc

+0

Bitte lassen Sie mich wissen, wie Sie gehen, weil es ungetestet ist und ich möchte das gleiche irgendwann tun :-) –

+0

Antwort auf die Ticket, wenn dies alles ist, was Sie ändern müssen. Für zusätzliche Pluspunkte könntest du sogar dort arbeiten und alle profitieren davon! :) – SmileyChris

-1

Was ist mit diesem Ansatz falsch? Irgendeine Idee, wie man dieses Feature implementiert?

Was ist falsch mit diesem Ansatz ist, dass Berechtigungen und Gruppen können Sie bereits mit, was Sie benötigen. Sie müssen AdminSite nicht ableiten, wenn Sie nur die Benutzer teilen müssen. Diese

ist wahrscheinlich, warum ist diese Funktion so schlecht dokumentiert, IMHO

+1

Die 2ndary-Site ist nicht nur eine andere Möglichkeit, Berechtigungen zu verwalten. Es bietet benutzerdefinierte Bildschirme und zusätzliche Funktionen. Die Django Admin-Seite ist großartig und kann sehr individuell gestaltet werden. Stange, das ist ein bisschen schwierig zu individualisieren – luc

Verwandte Themen