Django rest framework-pro-Aktion-Berechtigung
Ich bin ein Neuling in der Entwicklung mit Django + Django-Rest-framework, und ich bin an einem Projekt arbeiten, bietet die REST-Api zugreifen. Ich Frage mich, was ist die beste Vorgehensweise zum zuweisen einer anderen Berechtigung zu jeder Aktion eines bestimmten ApiView oder Viewset.
Nehmen wir an, ich definierte Berechtigungen Klassen wie 'IsAdmin', 'IsRole1', 'IsRole2', ..., und ich will zu gewähren unterschiedliche Berechtigungen für die einzelnen Handlungen (z.B. ein Nutzer mit Role1 erstellen oder abzurufen, kann ein Benutzer mit Role2 aktualisieren können, und nur ein Admin kann löschen).
Wie kann ich die Struktur einer class-based view, um zum zuweisen einer permission-Klasse zu den 'create', 'Liste', 'abgerufen', 'update', 'delete' - Aktionen?
Ich versuche, so zu tun, um eine Klasse, die wiederverwendet werden können, für verschiedene Tabellen, die die gleiche Berechtigung Muster.
Vielleicht bin ich einfach ertrinken in einem Zoll von Wasser, vielen Dank für Ihre Antworten.
InformationsquelleAutor der Frage lWhitmore | 2013-10-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie erstellen, benutzerdefinierte Berechtigung Klasse Ausweitung der DRF ist
BasePermission
.Implementieren Sie
has_permission
wo Sie Zugriff auf dierequest
undview
Objekte. Sie können überprüfenrequest.user
für die entsprechende Rolle und zurückTrue
/False
als angemessen.Haben Sie einen Blick auf die mitgelieferte IsAuthenticatedOrReadOnly Klasse (und andere) für ein gutes Beispiel, wie einfach es ist.
Ich hoffe, das hilft.
InformationsquelleAutor der Antwort Carlton Gibson
In DRF Dokumentation,
Nehmen wir an, folgende Berechtigung zu
user
Objektpermissons.py
views.py
BEARBEITEN
Für Django 2.0 ersetzen
is_authenticated()
mitis_authenticated
. Die Methode wurde in ein Attribut.InformationsquelleAutor der Antwort Chemical Programmer
Django hat eine persmissions Klasse namens DjangoObjectPermissions was nutzt Django-Guardian als ein Authentifizierungs-backend.
Wenn man Django-guardian aktiv in Ihren Einstellungen fügen Sie einfach
permission_classes = [DjandoObjectPermissions]
auf Ihre Ansicht und es tut Berechtigung Authentifizierung automatisch, so kann man 'CRUD', basierend auf der Genehmigung auf einen bestimmtendjango.contrib.auth
Gruppe oder Benutzer.Sehen gist mit einem Beispiel.
Sie können Django-Guardian, wie Ihr die Authentifizierung gesichert http://django-guardian.readthedocs.org/en/latest/installation.html
InformationsquelleAutor der Antwort
RestFramework s-Klasse-basierte Ansichten-Methoden für die einzelnen HTTP-verb (sprich : HTTP-GET => Ansicht.get() usw). Sie müssen nur verwenden, django.contrib.auth die Berechtigungen für Benutzer, Gruppen und Dekorateure, wie dokumentiert.
InformationsquelleAutor der Antwort bruno desthuilliers
Ich persönlich hasse diese Art von frankenmonster benutzerdefinierten Berechtigungen, meiner Meinung nach, es ist nicht sehr idiomatisch, wenn es um Django-framework;
So kam ich mit der folgenden Lösung - es ist sehr ähnlich wie
@list_route
und@detail_route
Dekorateure arbeiten.Wir verlassen uns auf die Tatsache, dass die Methoden/Funktionen sind first-class Objekte
Zuallererst bin ich die Erstellung solcher decorator:
decorators.py
Wie Sie sehen können, fügt es ein Wörterbuch, um die Funktion, die es schmückt mit übergebenen Parameter als Liste arg
Nun erstellte ich eine solche mixin:
mixins.py
Mixin zwei Dinge tut;
wenn
get_permissions
aufgerufen wird, prüft es die 'action' ausgeführt wird, und looksup die permission_classes Sammlung vonroute_action_kwargs
im Zusammenhang mit derviewset.action_method.route_action_kwargs
wenn
get_serializer_class
heißt, es macht das gleiche, und nimmt dieserializer
ausroute_action_kwargs
Nun die Art, wie wir es verwenden können:
Für benutzerdefinierte Routen definieren wir explizit können wir nur die
@route_action_arguments
explizit auf die Methode.In Bezug auf generische viewsets und Methoden, die wir noch hinzufügen können Sie mit der
@method_decorator
InformationsquelleAutor der Antwort Marcin Kudzia