Frage Wie verwende ich Django-Gruppen und Berechtigungen?


Ich verstehe die grundlegenden Benutzer Sachen. Ich kenne Authentifizierung, login, Erstellen von Konten usw. Aber jetzt möchte ich an Gruppen und Berechtigungen arbeiten.

Wo ist die Dokumentation für Django-Gruppen / Berechtigungen? Das ist es nicht: http://docs.djangoproject.com/de/dev/topics/auth/


75
2018-01-24 04:36


Ursprung


Antworten:


Ich denke, die erste Frage, die Sie stellen müssen, ist, welche Berechtigungen Sie benötigen und welche Art. Mit welcher Art, meine ich, wollen Sie Model- oder Object-Level. Um den Unterschied zu verdeutlichen, haben Sie ein Modellauto. Wenn Sie Berechtigungen für alle Autos erteilen möchten, ist Model-level geeignet, aber wenn Sie pro Auto Berechtigungen erteilen möchten, möchten Sie auf Objektebene. Sie können beide benötigen, und das ist kein Problem, wie wir sehen werden.

Für Modell-Berechtigungen behandelt Django diese für Sie ... meistens. Für jedes Modell erstellt Django Berechtigungen in der Form 'appname.permissionname_modelname'. Wenn Sie eine App namens "drivers" mit dem Modell "Car" haben, wäre eine Erlaubnis "drivers.delete_car". Die von Django automatisch erstellten Berechtigungen werden erstellt, geändert und gelöscht. Aus irgendeinem seltsamen Grund haben sie sich entschieden, keine Leseberechtigungen von CRUD einzubauen, Sie müssen dies selbst tun. Beachten Sie, dass Django entschieden hat, das CRUD-Update aus irgendeinem Grund in "Ändern" zu ändern. Um einem Modell mehr Berechtigungen hinzuzufügen, sagen Sie Leseberechtigungen, verwenden Sie die Meta-Klasse:

class Car( models.Model ):
    # model stuff here
    class Meta:
        permissions = ( 
            ( "read_car", "Can read Car" ),
        )

Beachten Sie, dass Berechtigungen eine Menge von Tupeln sind, wobei die Tupel-Elemente die oben beschriebene Berechtigung und eine Beschreibung dieser Berechtigung sind. Sie müssen nicht der Konvention permname_modelname folgen, aber ich bleibe normalerweise dabei.

Um die Berechtigungen zu überprüfen, können Sie has_perm verwenden:

obj.has_perm( 'drivers.read_car' )

Dabei ist obj entweder eine Benutzer- oder eine Gruppeninstanz. Ich denke, es ist einfacher, eine Funktion dafür zu schreiben:

def has_model_permissions( entity, model, perms, app ):
    for p in perms:
        if not entity.has_perm( "%s.%s_%s" % ( app, p, model.__name__ ) ):
            return False
    return True

Wo Entität das Objekt ist, um Berechtigungen auf (Gruppe oder Benutzer) zu überprüfen, ist Modell die Instanz eines Modells, Dauer ist eine Liste von Berechtigungen als zu überprüfende Zeichenfolgen (zB ['lesen', 'ändern']), und app ist das Anwendungsname als Zeichenfolge Um die gleiche Prüfung wie has_perm oben durchzuführen, würden Sie etwas wie folgt aufrufen:

result = has_model_permissions( myuser, mycar, ['read'], 'drivers' )

Wenn Sie Objekt- oder Zeilenberechtigungen verwenden müssen (sie meinen dasselbe), kann Django Ihnen nicht wirklich helfen. Das Schöne ist, dass Sie sowohl Modell- als auch Objektberechtigungen nebeneinander verwenden können. Wenn Sie Objektberechtigungen haben möchten, müssen Sie entweder schreibe dein Eigenes (wenn Sie 1.2+ verwenden) oder ein Projekt finden, das jemand anderes geschrieben hat, eines, das ich mag Django-Objektpermissionen vom Waschen zu Zeiten.


110
2018-01-24 17:19