2016-04-24 5 views
0

Die meisten Beispiele, die ich sehe, implementieren REST-URL-Muster wie http://www.app.com/books/1, um auf ein Buch mit ID 1 oder http://www.app.com/books zuzugreifen, um auf alle Bücher zuzugreifen.REST API Design für Systeme mit mehreren Unternehmen oder Organisationen

Das ist großartig, aber häufig arbeite ich an Anwendungen, die mehrere Unternehmen unterstützen. Beispiel: Firma ABC hat 2 Benutzer und Firma DEF hat 2 Benutzer. Ein Benutzer von Firma ABC erstellt ein Buch mit ID 100. Wenn nun ein RESTful Aufruf an Unternehmen in von einem Benutzer kommt DEF:

http://www.app.com/books/100

es brauchen würde, eine Access-Ausnahme sein, oder

http://www.app.com/books

würde Liste nur alle Bücher gehören, zu DEF (nicht das neue Buch mit ID 100). Für viele Entitäten, wie Book, ist die Firmen-ID Teil der Tabelle, aber für andere Entitäten, die nicht der Fall sein können. Wenn beispielsweise für ein Kapitel in einem Buch eine REST-Operation ausgeführt wurde, würde http://www.app.com/chapter/333 die Kapiteltabelle einen Fremdschlüsselverweis auf das Buch haben, nicht jedoch auf die Firma.

Was wäre die beste Vorgehensweise für die Verwaltung des Zugriffs auf diese Ressource? Wenn jemand von DEF versucht, auf ein Kapitel von ABC zuzugreifen, müsste ich eine Abfrage erstellen, um dem Kapitel beizutreten, um zu überprüfen, ob die Firmen-ID gültig ist.

Ich benutze Grails 3.x, wo die meisten dieser Logik abstrahiert ist und denkt "automatisch" passieren. Eine URL, die für eine bestimmte Buch-ID eingegeben wird, wird automatisch zurückgegeben, und die Anforderung zum Auflisten aller Bücher gibt jedes Buch in der Datenbank zurück. Es scheint so, als müsste ich die meisten dieser automatischen Funktionen außer Kraft setzen und meine eigene Sicherheit implementieren, vielleicht in der Dienstschicht, wo die Firmen-ID für jede Operation ein erforderlicher Parameter wäre. Klingt das vernünftig?

Gibt es eine etablierte Best Practice für diese Art von Sache?

+0

Zum größten Teil haben wir die Sicherheit der auf der Abfrage hinzufügen Informationen des Benutzers (mit SpringSecurityPlugin) auf der Serverseite (der Client weiß nicht einmal, ob er Teil der Abfrage ist). Vereinfacht gesagt, würden wir followByCompany() und findByIdAndCompany immer dann verwenden, wenn wir list() möchten, oder fügen Sie in allen REST-angeforderten Suchvorgängen Company als Kriterium hinzu. Ein Teil der Buch-Domain wäre ein Unternehmen (oder eine Gruppe von Unternehmen), das es erstellt hat/hat. – billjamesdev

+0

Genau - SpringSecurity verwenden, um jede Anfrage über Token im Anfrage-Header zu authentifizieren. Danach können Sie jede gewünschte Logik implementieren und Ihre App weiß, welches Unternehmen nach Daten fragt. Check: ** org.grails.plugins: feather-security-core ** und ** org.grails.plugins: feather-security-rest ** –

Antwort

0

Sie wissen nicht, ob es Ihren Bedürfnissen passt, aber es ist interessant zu wissen, ein ACL-Plugin von Burt Beckwith geschrieben ist:

Spring Security ACL Plugin