Hintergrund:
Derzeit wird eine REST-API unter Verwendung des Knotens w / express erstellt, die von einer mobilen App und schließlich einer (modernen browserbasierten) Website verwendet wird.
Ich versuche herauszufinden, wie die Aktualisierungs- / Aktionsanforderung eines Benutzers am besten autorisiert werden kann, damit er nur seine eigenen Ressourcen ändern kann. Die Aktionen werden mit einer halbhohen Rate stattfinden, daher die Sorge.
Hinweis: Das Eigentum an Unternehmen kann in diesem Anwendungsfall nicht übertragen werden.
Potentielle Lösungen:
Lösung : Speichern und pflegen Sie eine Liste der Ressourcen jedes Benutzers in einer Serversitzung, die von reddis unterstützt wird.
Bedenken : Das Fortbestehen einer serverseitigen Sitzung hat ihre eigenen Komplexitäten, die speziell mit mehreren Servern skaliert werden können. Dies verstößt auch gegen den REST. Do-Sessions-wirklich-verletzen-Ruhe für weitere Informationen.
Lösung: Führen Sie vor der Update- / Aktionsabfrage des Benutzers eine Leseabfrage durch. IE geben mir die Elemente dieses Benutzers dann, wenn es in der Liste ist, mit dem Update fortfahren.
Bedenken: Overhead eines zusätzlichen Lesevorgangs jedes Mal, wenn ein Benutzer im Namen einer Ressource handelt.
Lösung: Übergeben Sie die Benutzer-ID an die Datenbankschicht und machen Sie sie Teil des Updates. Wenn Sie Lust haben, verwenden Sie für diese Ressource je nach Daten-Backend die Sicherheit auf Zeilenebene von Postgres.
Bedenken: Dies scheint etwas spät im Anforderungslebenszyklus zu sein, um zu überprüfen, ob die Ressource der anfordernde Benutzer ist. Der Fehler müsste vollständig aus dem Daten-Backend entfernt werden. Aus dem gleichen Grund wäre es auch etwas fehl am Platz, wenn man bedenkt, dass die Authentifizierung und rollenbasierte Autorisierung häufig zu Beginn des Anforderungslebenszyklus erfolgt. Die Implementierung ist auch vom Daten-Backend abhängig. Außerdem wird die Geschäftslogik in das Daten-Backend verschoben.
Lösung: Client-seitig signierte Sitzung. Entweder mit einem JWT oder einem verschlüsselten / signierten Cookie. Im Wesentlichen wird eine vertrauenswürdige Sitzung verwaltet, die eine Liste der Ressourcen-IDs des Benutzers enthält.
Bedenken: Die Größe der clientseitigen Sitzung. Die Tatsache, dass es mit jeder einzelnen Anfrage gesendet wird, auch wenn es nicht benötigt wird. Die Wartung wird äußerst komplex, wenn Sie die Möglichkeit mehrerer aktiver Sitzungen / Clients einführen. Wie würden Sie den clientseitigen Status aktualisieren, wenn eine Ressource auf einem anderen Client hinzugefügt wurde?
Lösung: Übergeben Sie beim Abrufen der Ressource ein signiertes Update-Token (JWT) oder eine URL an den Client mit der Ressource. Erwarten Sie dies, wenn eine Ressource aktualisiert / bearbeitet wird. Das signierte Token würde die Benutzer-ID und die Ressourcen-ID enthalten, und Sie könnten diese leicht überprüfen.
Bedenken: Wird komplex, wenn der Besitz von Ressourcen übertragbar ist, aber in meinem Fall ist dies kein Problem. Führt Komplexität beim Lesen vor dem Update ein. Es ist ein bisschen seltsam?
Abschließende Gedanken:
Ich neige zur letzten Lösung, aber weil ich es nicht sehr oft sehe, frage ich mich, ob mir etwas fehlt? oder vielleicht ist es Teil eines Designmusters, von dem ich nichts weiß.