2016-11-04 3 views
1

Hintergrund Ich erstelle eine Anwendung, in der alle Benutzer zu einer Organisation gehören. Ich möchte nur, dass der Benutzer in der Organisation, zu der er gehört, Datensätze erstellen/lesen/aktualisieren/löschen kann.CRUD nur für die Organisation, der der Benutzer angehört

Ich benutze Segel, aber ich suche nach Connect/Express-basierte oder eine eigenständige Antwort als sails-Berechtigungen Knotenmodul nicht beibehalten wird.

Frage Wie kann man eine Autorisierung implementieren, die CRUD nur für die Organisation zulässt, zu der der Benutzer gehört?

Antwort

0

Sie werden jede Anfrage durch Überprüfung middlewares

sie mit einem Rollensystem kombinieren mit abfangen müssen, wenn eine bestimmten Token auf Anfrage-Header und in einer acl Karte vorhanden sind, und schließlich, wenn das Token in der Gegenwart acl map, sehen Sie, welche Berechtigungen mit diesem Token verknüpft sind.

2

Wir sind auch nicht auf Segel-Berechtigungen angewiesen. In unserer App können Nutzer Mitglieder mehrerer Organisationen sein.

Wir verwenden auth0 für alle Authentifizierungsaktivitäten, d. H. Jede Anfrage muss eine JWT enthalten, die im Anforderungsheader enthalten ist. Der JWT enthält userId, orgId und role.

Sails-Richtlinien dekodieren den JWT und hängen userId, orgId und role an das req-Objekt für alle späteren Überprüfungen an.

Jedes Modell hat die Eigenschaft orgId - wir verwenden MongoDB. Jeder Controller, jede DB-Operation usw. fügt diese verifizierte orgId der Abfrage hinzu. Tatsächlich haben wir eine kleine Pipeline, die die Abfrage vorbereitet: Wir fügen die orgId hinzu, in Aktualisierungsfällen filtern wir unerwünschte Eigenschaftsaktualisierungen aus usw.

Dieser Ansatz erfordert keine zusätzlichen db-Aufrufe für die Trennung von Mandanten.

Einige Modelle haben spezifische Zugriffsanforderungen für einzelne RECORD. Hier speichern wir die Eigenschaften von allowedUser (eine für das Lesen, eine für die Aktualisierung usw.) auf genau diesem Datensatz und wir erweitern die Abfrage noch einmal, so dass nur Datensätze zurückgegeben oder aktualisiert werden oder Xyz, wo der aktuelle Benutzer in der anwendbaren allowedUsers-Eigenschaft enthalten ist.

Dieser Ansatz erfordert auch keine zusätzlichen db-Aufrufe. Dies nutzt jedoch MongoDB-spezifische Abfragefunktionen.

Wir haben derzeit keine ACL-ähnliche Anforderungen, die zwischen den beiden oben beschriebenen Ansätzen (Re Access Control Granularity) richtig wäre.

+0

_ "Jedes Modell hat die Eigenschaft orgId - wir verwenden MongoDB. Jeder Controller, db-Vorgang usw. fügt diese verifizierte orgId zur Abfrage hinzu. Tatsächlich haben wir eine kleine Pipeline, die die Abfrage vorbereitet: wir fügen die orgId in update hinzu Fälle filtern wir unerwünschte Eigenschaft Updates, etc. "_ Jede Chance, die Sie ein Beispiel dafür geben können, wie Sie dies in .Find() usw. injizieren? – user1885523

Verwandte Themen