Ich entwerfe die Autorisierung einer DRF-Anwendung. Ich brauche Rollen, nicht nur Berechtigungen.Design Django Rest Framework rollenbasierte Autorisierung
Ich habe ein Modell (z. B. project
), in dem ich einige Informationen (z. B. Name, Beschreibung), die durch einige Rollen (z. B. admin
) geändert werden können. Aber zur gleichen Zeit gibt es andere Rollen (z. B. worker
), die nicht in der Lage sein sollten, diese Information innerhalb dieses Modells zu modifizieren, aber dennoch einige andere Informationen (z. B. Anfangs- und Endtermine) modifizieren können.
Ich habe zwei Lösungen für dieses Problem gedacht. Die erste liest die gesendete HTTP-Anfrage und definiert die auszuführenden Aktionen abhängig von der Anfrage. Dies bedeutet, dass jedes Mal, wenn dem Modell ein neues Feld hinzugefügt wird, diese Logik geändert werden muss. Das klingt furchtbar schwer zu pflegen, ist fehleranfällig und kann Schwachstellen verursachen.
Auf der anderen Seite habe ich gedacht, dass ich das Modell in zwei verschiedene Modelle teilen könnte. Einer davon enthält die Daten, die nur eine Rolle (admin
) ändern kann, und der andere definiert die anderen Daten, die von beiden Rollen geändert werden können (admin
, worker
). Auf diese Weise muss ich die HTTP-Anfrage nicht analysieren, denn wenn ich eine POST/PUT-Anfrage bekomme, die das erste Modell betrifft und der Benutzer eine Worker-Rolle hat, kann ich sie direkt ablehnen.
Diese Situation tritt bei mehreren Modellen auf.
Ich würde gerne wissen, ob es einen Standardweg gibt oder ob ich das Rad neu erfinde. Ich denke, dass diese Situation wirklich üblich sein muss. Ich denke zum Beispiel an ein Git-Projekt, bei dem einige Benutzer Zugriff auf eine Sache in einem Projekt haben, aber nicht auf andere.
Ergänzende Hinweise (Feed-back wird sehr geschätzt werden):
ich am meisten wahrscheinlich verwenden, um die django-role-permissions Modul Rollen und Berechtigungen zu implementieren. Ich kann keine integrierten django-Gruppen verwenden, da ich ihnen zwar Berechtigungen hinzufügen kann, sie aber zum Gruppieren von Benutzern verwende (ohne mit Rollen zu tun zu haben).
Ich werde eine Beziehung zwischen Rollen und Berechtigungen (string-basierte Berechtigung, wie
create_project
,modify_project_description
) in einer Datei mit Berechtigungen erstellen.Wenn ich jede Anfrage erhalte, überprüfe ich, welche Rollen Privilegien haben, um diese Aktion durchzuführen und zu prüfen, ob der Benutzer eine dieser Rollen ist (aktivitätsbasierte Autorisierung, was bedeutet, dass ich am Endpunkt die Aktivität/Aktion überprüfe) der Rolle).
Sie verdienen eine Verbesserung, weil ich am Ende alles implementiert, was Sie erwähnen (abgesehen vom Proxy-Modell). – newlog