Wie verwende ich Django-Gruppen und Berechtigungen?

Antworten:

121

Ich nehme an, die erste Frage, die Sie stellen müssen, ist, welche Berechtigungen Sie benötigen und welche. Mit welcher Art meine ich, wollen Sie Modell- oder Objektebene. Um den Unterschied zu verdeutlichen, sagen Sie, Sie haben ein Modellauto. Wenn Sie Berechtigungen für alle Fahrzeuge erteilen möchten, ist die Modellebene angemessen. Wenn Sie jedoch Berechtigungen für jedes Fahrzeug erteilen möchten, möchten Sie die Objektebene. Möglicherweise benötigen Sie beides, und dies ist kein Problem, wie wir sehen werden.

Für Modellberechtigungen übernimmt Django diese für Sie ... meistens. Für jedes Modell erstellt Django Berechtigungen in der Form 'appname.permissionname_modelname'. Wenn Sie eine App namens "Fahrer" mit dem Automodell haben, lautet eine Berechtigung "drivers.delete_car". Die Berechtigungen, die Django automatisch erstellt, werden erstellt, geändert und gelöscht. Aus irgendeinem seltsamen Grund haben sie beschlossen, keine Leseberechtigungen von CRUD einzuschließen. Sie müssen dies selbst tun. Beachten Sie, dass Django aus irgendeinem Grund beschlossen hat, CRUDs 'Update' in 'change' zu ändern. Um einem Modell weitere Berechtigungen hinzuzufügen, z. B. 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 Reihe von Tupeln sind, wobei die Tupelelemente die oben beschriebene Berechtigung und eine Beschreibung dieser Berechtigung sind. Sie müssen die Konvention permname_modelname nicht befolgen, aber ich halte mich normalerweise daran.

Zum Überprüfen der Berechtigungen können Sie schließlich has_perm verwenden:

obj.has_perm( 'drivers.read_car' )

Wobei obj entweder eine Benutzer- oder eine Gruppeninstanz ist. 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

Wenn Entität das Objekt ist, für das Berechtigungen überprüft werden sollen (Gruppe oder Benutzer), Modell die Instanz eines Modells ist, Dauerwellen eine Liste von Berechtigungen als zu überprüfende Zeichenfolgen sind (z. B. ['Lesen', 'Ändern']) und App die ist Anwendungsname als Zeichenfolge. Um die gleiche Prüfung wie bei has_perm oben durchzuführen, würden Sie Folgendes aufrufen:

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

Wenn Sie Objekt- oder Zeilenberechtigungen verwenden müssen (diese bedeuten dasselbe), kann Django Ihnen selbst nicht wirklich helfen. Das Schöne ist, dass Sie sowohl Modell- als auch Objektberechtigungen nebeneinander verwenden können. Wenn Sie Objektberechtigungen wünschen, müssen Sie entweder Ihre eigenen schreiben (wenn Sie 1.2+ verwenden) oder ein Projekt finden, das jemand anderes geschrieben hat. Ich mag Django-Objektberechtigungen aus Waschzeiten .

Alex Kuhl
quelle
27
Dies ist eine großartige Antwort für Berechtigungen, berührt aber kaum Gruppen und wie sie in Django arbeiten?
NotSimon
4
Gruppen haben nicht viel zu bieten, sie dienen hauptsächlich dazu, Benutzer zu bündeln, um Berechtigungen anzuwenden, ähnlich wie Linux-Benutzergruppen. Sie erteilen einer Gruppe eine Berechtigung, die sich auf alle Mitglieder dieser Gruppe erstreckt. Die Dokumentation sagt wirklich alles: docs.djangoproject.com/de/dev/topics/auth/default/#groups .
Alex Kuhl
1
Ich fühle mich gezwungen, hier darauf hinzuweisen, dass Sie in Betracht ziehen möchten, dafür Django-Wächter zu verwenden. Die Aufschlüsselung des Autorisierungspakets finden Sie hier. Auch dieser SOF-Link bietet einen schönen Vergleich.
Jeff Sheffield
1
Als ich darauf stieß und eine Objektgenehmigung benötigte, fand ich django-guardian: django-guardian.readthedocs.org/en/v1.2
dArignac
1
Das "Schreiben Sie Ihre eigenen" ist unten. Oder so. Es ist jetzt auf Chinesisch.
William Karlsson