Ich möchte ein auf Berechtigungen basierendes System verwenden, um bestimmte Aktionen in meiner Django-Anwendung einzuschränken. Diese Aktionen müssen sich nicht auf ein bestimmtes Modell beziehen (z. B. Zugriff auf Abschnitte in der Anwendung, Suchen ...), daher kann ich das Framework für Bestandsberechtigungen nicht direkt verwenden, da für das Permission
Modell ein Verweis auf einen installierten Inhaltstyp erforderlich ist.
Ich könnte mein eigenes Berechtigungsmodell schreiben, aber dann müsste ich alle in den Django-Berechtigungen enthaltenen Goodies neu schreiben, wie z.
- Die Möglichkeit, Benutzern und Gruppen Berechtigungen zuzuweisen.
- Der
permission_required
Dekorateur . User.has_perm
und verwandte Benutzermethoden.- Die
perms
Vorlagenvariable . - ...
Ich habe einige Apps wie Django-Authority und Django-Guardian überprüft , aber sie scheinen Berechtigungen bereitzustellen, die noch stärker an das Modellsystem gekoppelt sind, indem sie Berechtigungen pro Objekt zulassen.
Gibt es eine Möglichkeit, dieses Framework wiederzuverwenden, ohne ein Modell (außer User
und Group
) für das Projekt definiert zu haben?
quelle
Für diejenigen von Ihnen, die noch suchen:
Sie können ein Hilfsmodell ohne Datenbanktabelle erstellen. Dieses Modell kann jede Erlaubnis, die Sie benötigen, in Ihr Projekt einbringen. Es ist nicht erforderlich, sich mit ContentType zu befassen oder Berechtigungsobjekte explizit zu erstellen.
Gleich danach
manage.py makemigrations
undmanage.py migrate
Sie können diese Berechtigungen wie alle anderen verwenden.quelle
default_permissions = ()
. Dadurch wird verhindert, dass Django automatisch die Standardberechtigungen zum Hinzufügen / Ändern / Löschen / Anzeigen für dieses Modell erstellt, die bei Verwendung dieses Ansatzes höchstwahrscheinlich nicht erforderlich sind.Nach Gonzalos Rat habe ich ein Proxy-Modell und einen benutzerdefinierten Manager verwendet , um meine "modelllosen" Berechtigungen mit einem Dummy-Inhaltstyp zu verarbeiten.
quelle
FieldError: Cannot resolve keyword 'name' into field. Choices are: app_label, id, logentry, model, permission
.Fix für Chewies Antwort in Django 1.8, die in einigen Kommentaren angefordert wurde.
In den Versionshinweisen heißt es:
Es ist also der 'Name', auf den in ContentType verwiesen wird, der nicht in GlobalPermissions verwendet wird.
Wenn ich es behebe, bekomme ich folgendes:
Die GlobalPermissionManager-Klasse ist unverändert, der Vollständigkeit halber jedoch enthalten.
quelle
Dies ist eine alternative Lösung. Fragen Sie sich zunächst: Warum nicht ein Dummy-Modell erstellen, das tatsächlich in der Datenbank vorhanden ist, aber nie verwendet wird, außer zum Halten von Berechtigungen? Das ist nicht schön, aber ich denke, es ist eine gültige und einfache Lösung.
Die obige Lösung hat den Vorteil, dass Sie die Variable
Permissions.can_search_blue_flower
in Ihrem Quellcode verwenden können, anstatt die Literalzeichenfolge "my_app.can_search_blue_flower" zu verwenden. Dies bedeutet weniger Tippfehler und mehr Autovervollständigung in der IDE.quelle
managed=False
Sie die VerwendungPermissions.can_search_blue_flower
aus irgendeinem Grund nicht zu?Sie können das
proxy model
hierfür mit einem Dummy-Inhaltstyp verwenden.Jetzt können Sie die Berechtigung mit nur
name
undcodename
mit der Berechtigung aus demCustomPermission
Modell erstellen .Und Sie können nur die benutzerdefinierten Berechtigungen in Ihren Vorlagen wie folgt abfragen und anzeigen.
quelle
Anstatt diesen Code zu schreiben und auszuführen, der Datensätze in die Datenbank einfügt, können Sie die Datensätze einfach in Ihre Datenbank einfügen (offensichtlich den Primär- und den Fremdschlüssel nach Bedarf bearbeiten).
Und dann haben Sie in Ihrem Anwendungsadministrator die Möglichkeit, Ihren Benutzern oder Gruppen "Ist Mitarbeiter" zuzuweisen. Um diese Berechtigung in Ihrer Klasse zu überprüfen, würden Sie schreiben
quelle