ACL Best Practices, Rollen im Benutzerobjekt speichern oder separate Tabelle / Sammlung?

8

Ich benutze nodejs und habe die acl / authorization für die letzte Woche untersucht. Ich habe nur ein paar gefunden, aber keines scheint alle Funktionen zu haben, die ich brauche. Das nächstgelegene war Ссылка , aber ich denke nicht, dass es das Schützen von Ressourcen nach ID unterstützt (zum Beispiel, wenn ich Benutzern erlauben wollte 12345 und nur Benutzer 12345, um auf Benutzer / 12345 / edit zuzugreifen). Daher denke ich, dass ich eine individuelle Lösung für mich selbst machen muss.

Meine Frage dazu lautet: Welche Vor- und Nachteile birgt das Speichern von Rollen (Benutzer, Administrator, Moderator usw.) unter jedem Benutzerobjekt, im Gegensatz zum Erstellen einer anderen Sammlung / Tabelle, die jeden Benutzer mit ihrem Benutzer abbildet Autorisierungsregeln? node_acl verwendet eine separate Sammlung, während die meisten anderen vom Rollen-Array in Benutzerobjekten abhängen.

Übrigens verwende ich Mongodb im Moment. Allerdings habe ich noch nicht über die Vor- und Nachteile der Verwendung von relationalen und nichtrelationalen Datenbanken für die Authentifizierung geforscht, also lassen Sie mich wissen, ob Ihre Antwort davon abhängt.

Als ich das eintippte, dachte ich an eine Sache. Wenn ich Rollen in einer separaten Sammlung speichere, ist sie tragbarer. Ich könnte das acl-System viel leichter austauschen. (Ich denke?)

    
az_ 12.01.2013, 17:38
quelle

2 Antworten

9

Die Frage scheint hier von "wo sollte ich meine Rollen speichern?" zu abstrahieren, "wie sollte ich verwandte Informationen in Mongo (oder NoSQL im Allgemeinen) speichern". Es ist ein relation vs. nicht-relationales Modellierungsproblem.

Nicht-relational

Mit Knoten + Mongo wird es beim Speichern der Rollen für den Benutzer sehr einfach möglich, festzustellen, ob ein Benutzer Zugriff auf die Funktion hat, da Sie nur in der Eigenschaft 'Rollen' nachsehen können. Der Nachteil ist, dass Sie viele doppelte Informationen haben ("user_read" könnte eine Rolle in jedem Benutzerkonto sein) und wenn Sie diese Eigenschaft ändern, müssen Sie sie innerhalb von jedes Benutzerobjekt.

Sie können die Rollen in einer eigenen Sammlung speichern und dann die ID für diesen Eintrag in der Roles-Sammlung Ihres Benutzermodells speichern. Sie müssen jedoch den aktuellen Datensatz aus der Sammlung abrufen, um alle Informationen anzuzeigen (obwohl dies wohl selten vorkommt)

Relational

Das Speichern in einem relationalen DB wäre ein eher "traditioneller" Ansatz, da Sie die Beziehungen zwischen den Tabellen herstellen können (über FKs / Join-Tabellen oder was nicht). Diese kann eine gute Lösung sein, aber dann haben Sie nicht mehr die Vorteile einer NoSQL-Datenbank.

Zusammenfassung

Wenn der Rest Ihrer App in Mongo gespeichert ist und hat , um dort zu bleiben (für Leistung oder andere Einschränkungen), dann sind Sie wahrscheinlich besser dran, alles in Mongo zu tun. Die meisten Ratschläge, auf die ich gestoßen bin, sagen, vermischen & amp; Datenspeicher abgleichen, z.B. benutze das eine oder das andere, aber nicht beides. Davon abgesehen habe ich Projekte mit beiden gemacht und es kann chaotisch werden, aber manchmal überwiegen die Vorteile die Nachteile.

    
David Welch 12.01.2013, 18:03
quelle
3

Ich mag die Antwort von @DavidWelch, aber ich möchte die Frage aus einer anderen Perspektive betrachten, weil die erwähnte Bibliothek die Option bietet, einen anderen Datenspeicher vollständig zu verwenden.

Rollen in einem separaten Datenspeicher speichern:

  • (Pro) Kann das System leistungsfähiger machen, wenn Sie einen schnelleren Datenspeicher verwenden. (In verteilten Umgebungen vorteilhafter?)
  • (Con) Sie müssen die Konsistenz zwischen den beiden Datenspeichern sicherstellen.

Allgemeine Hinweise:

  • Sie können Rollen / Berechtigungen wie "blog \ 123" in acl hinzufügen. Sie können einem Benutzer auch Berechtigungen basierend auf Verben wie Put, Delete, Get, etc geben.
  • Ich denke, es ist einfacher, eine Pluggable-Lösung zu erstellen, die nicht von Ihrer Speicherimplementierung abhängt. Vielleicht speichert acl deshalb keine Rollen in denselben Sammlungen wie Sie.
  • Wenn Sie die Rollen in Ihrer eigenen Sammlung behalten möchten, sollten Sie sie einem Token (JWT) hinzufügen. Auf diese Weise müssen Sie Ihre Sammlung nicht für jede Anfrage, die eine Autorisierung benötigt, überprüfen.

Ich hoffe, das hat geholfen.

    
Amri 03.05.2016 02:32
quelle

Tags und Links