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 ):
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 .