Django beschränkt den Zugriff auf Benutzerobjekte

user1330734

Ich habe Knoten- und Benutzermodelle, die beide zu einer Organisation gehören. Ich möchte sicherstellen, dass ein Benutzer immer nur Knoteninstanzen sieht, die zu seiner Organisation gehören.

Zu diesem Zweck möchte ich den Node Objects Manager mit einem überschreiben, der eine Abfrage_Satz von benutzerdefinierten gefilterten Ergebnissen zurückgibt.

Basierend auf https://docs.djangoproject.com/de/2.1/topics/db/managers/#modifying-a-manager-s-initial-queryset ist der relevante models.py- Code, den ich habe, unten:

class Organisation(models.Model):
    users = models.ManyToManyField(User, related_name='organisation')
    ...

class UserNodeManager(models.Manager):
    def get_queryset(self, request):
        return super().get_queryset().filter(organisation=self.request.user.organisation.first())


class Node(models.Model):
    organisation = models.ForeignKey(
        Organisation, related_name='nodes', on_delete=models.CASCADE)

    uuid = models.UUIDField(primary_key=True, verbose_name="UUID")
    ...

    objects = UserNodeManager

views.py

class NodeListView(LoginRequiredMixin, generic.ListView):
    model = Node

BEARBEITEN Ich kann einzelnen Ansichten ein benutzerdefiniertes Abfrageset hinzufügen. Dies funktioniert wie folgt:

views.py

class NodeListView(LoginRequiredMixin, generic.ListView):
    model = Node

    def get_queryset(self):
        return Node.objects.filter(organisation__users__id=self.request.user.pk)

Meine Absicht ist es jedoch, DRY zu sein und eine 'master'-query_set-Methode an einem einzelnen Punkt zu überschreiben, damit jede Ansicht (z. B. Formular-Dropdown-Liste, API-Endpunkt) die vom Benutzer eingeschränkte Abfrage ohne zusätzlichen Code ausführt.

Ich verwende beispielsweise die allgemeinen Listenansichten von django und habe ein Formular zum Hinzufügen eines Scan-Objekts, bei dem ein Benutzer einen Knoten auswählen muss, zu dem der Scan gehört. Das Formular zeigt derzeit Knoten von anderen Organisationen an, was gegen die von mir benötigte Berechtigungslogik verstößt.

Leider scheint die überschriebene Node.objects-Eigenschaft keine Auswirkung zu haben und jeder Benutzer kann alle Knoten sehen. Verfolge ich den richtigen Ansatz?

ruddra

Ich denke das Problem ist hier:

objects = UserNodeManager

Sie müssen die UserNodeManagerInstanz wie folgt initiieren :

objects = UserNodeManager()

Außerdem sollte beim Aufrufen der YourModel.objects.all()Methode (die von der angezeigten Methode aufgerufen wird get_queryset) ein Fehler ausgegeben werden , da sie beim Aufrufen der get_queryset()Methode nicht übergeben wird request. Ich denke, es wäre ein besserer Ansatz:

class UserNodeManager(models.Manager):
    def all(self, request=None):
       qs = super(UserNodeManager, self).all()
       if request:
          return qs.filter(...)
       return qs

Oder Sie können eine neue Manager-Methode wie folgt erstellen (optional):

class UserNodeManager(models.Manager):
    def user_specific_nodes(self, request):
       return self.get_queryset().filter(...)

Aktualisieren Sie auch in der Ansicht:

class NodeListView(LoginRequiredMixin, generic.ListView):
    model = Node

    def get_queryset(self):
        return Node.objects.all(self.request)  # where you can obviously use filter(...) or Model.objects.user_specific_nodes(self.request)

Aktualisieren

aus Kommentaren

Die Sache ist, dass Sie requestmit filter()oder bestehen müssen all(). In generischen Ansichten gibt die get_querysetMethode diese Informationen nicht an weiter all(). Also musst du das so oder so passieren. Es gibt eine andere Möglichkeit, eine Middleware wie diese Django-Crequest zu verwenden . Sie können es so verwenden:

from crequest.middleware import CrequestMiddleware

class UserNodeManager(models.Manager):
    def all(self):
       qs = super(UserNodeManager, self).all()
       request = CrequestMiddleware.get_request()
       return qs.filter(...)

Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.

Bei Verstößen wenden Sie sich bitte [email protected] Löschen.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

Der Django-Administrator beschränkt den Zugriff auf die Listenansicht

Django beschränkt den Zugriff auf die Ansicht für bestimmte Objekte

Gitolite beschränkt den Zugriff auf den Zweig

Laravel 5.7 beschränkt den Zugriff auf bestimmte Seiten

Zugriff auf Benutzerobjekte im Django Djoser Token Serializer

Django ManyToManyField beschränkt den Benutzer auf ein einzelnes Feld

Asp.net mvc beschränkt bestimmte Benutzer auf den Zugriff auf Ordnerinhalte

Die Symfony-Sicherheit beschränkt den Zugriff auf eine Routenliste auf bestimmte IP-Adressen

Spring Expression Language (SPEL) beschränkt den Zugriff auf Bean-Felder mit einer bestimmten Anmerkung

AWS beschränkt den Zugriff auf temporäre Anmeldeinformationen getSessionToken mithilfe von StsClient

Die Überladungsmethode der visuellen Komponente beschränkt den Zugriff auf private Mitglieder

Azure beschränkt den Zugriff auf Webanwendungen nach IP-Bereich

Die Laravel-Middleware beschränkt den Zugriff auf unerwünschte Funktionen

git: Beschränkt den Zugriff auf einen bestimmten Ordner für einige Benutzer in bitbucket

Django – Benutzer auf den Zugriff auf URLs beschränken

Wie beschränke ich den Zugriff auf Administrationsseiten in Django?

Die Web-API-Anwendung beschränkt den Zugriff auf die Dateien über den lokalen physischen Pfad

gitolite ermöglicht den vollständigen Zugriff auf alle Zweige, beschränkt sich jedoch auf einen bestimmten Satz

Kann ich ein Github-Zugriffstoken erhalten, das auf den Zugriff auf eine einzelne Organisation beschränkt ist?

Django Rest Framework beschränkt die Ansicht von Benutzerdaten auf Administratoren und den eigenen Benutzer

Gibt es etwas, das einem Zugriffsmodifikator entspricht, der den Zugriff mit C # auf nur einen Thread beschränkt?

ElasticSearch beschränkt den Zugriff mithilfe von IP-Tabellen

Yii2 beschränkt den Zugriff durch Benutzernamen

Dynamics CRM beschränkt den Zugriff durch das Eigentümerteam

Der Zugriff ist auf die Hosts-Datei beschränkt

Django-Graphen mit Relais, das den Zugriff auf Abfragen basierend auf der ID einschränkt

Beschränkt die Beschränkung einer App im Google Play Store auf bestimmte Länder auch den öffentlichen Beta-Zugriff?

Wie beschränke ich in Django is_staff-Mitglieder auf den Zugriff auf eine URL?

Django: Beschränken Sie den Zugriff auf statische Ordner auf nicht eingeloggte Benutzer

TOP Liste

  1. 1

    Wie aktualisiere ich ein Feld in einer Raumdatenbank mit einem Repository und einem Ansichtsmodell?

  2. 2

    Wie füge ich mehrere Spalten in einer Spalte mit derselben Tabelle in SQL Server zusammen?

  3. 3

    Wie kann man Gitterquadrate dazu bringen, die Farbe zu ändern?

  4. 4

    Ich kann nicht verstehen, wie man Go-Code in mehreren Dateien kompiliert

  5. 5

    Zählen Sie die Vorkommen jedes Werts in einem Tupel in Python

  6. 6

    Gibt es eine sauberere Möglichkeit, Konstruktorargumente und Instanzeigenschaften einer Klasse in Typescript zu definieren?

  7. 7

    So implementieren Sie Pushwoosh mit ionic 2

  8. 8

    Wie wird der Wert im Dropdown-Menü basierend auf den ausgewählten Daten / IDs angezeigt?

  9. 9

    Tomcat - Leiten Sie den alten Kontextstamm zum neuen Kontextstamm um

  10. 10

    Ändern Sie den Knotenpfad in das aktuelle Verzeichnis

  11. 11

    So erstellen Sie ein Array von Objekten aus zwei Arrays von Objekten mit einem gemeinsamen Schlüssel - JavaScript

  12. 12

    Rufen Sie die ID aus der Datagrid-Ansicht ab und zeigen Sie die Daten in Textfeldern einem anderen Formular an

  13. 13

    base js: Wie füge ich einem Objekt eine Eigenschaft auf die 'alte' Weise hinzu?

  14. 14

    Ersetze einen Teil einer Zeichenfolge durch eine Pandas-Spalte als Muster

  15. 15

    Blättern Sie auf Radio Click zur Abschnitts-ID

  16. 16

    CBCentralManager wird nach dem Verbinden neu gestartet

  17. 17

    Scherz, wie man eine Funktion verspottet, die von einer verspotteten Funktion zurückgegeben wird

  18. 18

    django-allauth Empfängersignal zum Hinzufügen einer Gruppenberechtigung zum Benutzer bei der Anmeldung

  19. 19

    Tic Tac Toe-Spiel im React-Reset-Button funktioniert nicht

  20. 20

    AQL: Teilweise Übereinstimmung in einer Reihe von Zeichenfolgen

  21. 21

    So summieren Sie die Werte zweier Tabellen und gruppieren sie nach Datum

heißlabel

Archiv