2017-06-06 4 views
0

Ich arbeite an einem Unternehmen und entwickle eine App, bei der der Benutzer eine CRUD-Datei verschiedener Art hat. Daten, wie wir alle wissen, könnten empfindlich sein, hängt vom Typ ab.Sicherheit auf Zeilenebene

Erstens, in meiner Firma haben wir verschiedene Arten von "Rollen". Unterschiedliche Rollen können unterschiedliche Daten anzeigen, abhängig vom Typ der Rolle. Was etwas seltsam klingt, ist, dass wir die Daten manuell filtern müssen, jede Abfrage, die wir auf dem System haben, hat die WHERE-Klausel mit den Regeln und es sieht für uns nicht richtig aus. Wir verwenden Hibernate, um unser DAO auszuführen.

Zweitens, auf meiner App ist es ein bisschen anders, aber haben das gleiche Ziel. Der Benutzer fügt Daten ein und er kann nur seine Daten sehen. Wenn er will, wird in jeder Abfrage ein Filter erstellt. Ich benutze mongodb mit Morphium, ich muss nach "Benutzer" filtern, aber hängt von dem Dokument ab, das ich suche, der Benutzer ist auf unterschiedlichem Niveau.

Beispiel:

  • Jeder Fonds haben einen Benutzer;
  • Jede Transaktion hat einen Fonds;

Wenn ich die Auflistung der Mittel des Benutzers i folgendes Dokument haben:

[ 
    { 
    "description": "xpto", 
    "user": { 
     "login": "Someone" 
    } 
    } 
] 

Wenn ich die Transaktionen des Benutzers das folgende Dokument Ich habe Auflistung bin:

[ 
    { 
    "value": 1234.23, 
    "date": "2017-01-01", 
    "fund": { 
     "description": "xpto", 
     "user": { 
     "login": "Someone" 
     } 
    } 
    } 
] 

Also, in der Abfrage von Geldern ich habe dies:

datastore.find(Fund.class).filter("user.login", getUser().getLogin()); 

In den Transaktionen:

datastore.find(Transaction.class).filter("funds.user.login", getUser().getLogin()); 

habe ich einige der Forschung und einige Ergebnisse finden, die nicht so klar für mich sind:

  • Row-Level-Sicherheit;
  • @filter in Hibernate

Row-Level-Security wird besser durch Datenbank gemacht. Also jede Abfrage, die gemacht wird, betrachtet die Datenbank die Regeln und filtert die Daten. Sieht doch gut aus, aber wie soll ich der Datenbank mitteilen, welcher Benutzer? Jeder Benutzer meines Systems muss in der Datenbank gewährt werden? Muss ein Benutzer in der Datenbank sein?

@Filter im Winterschlaf, macht das gleiche wie ich, aber zumindest ist es in der Klasse. In jeder Frage muss ich sagen, was ich filtern muss. Ist das Letzte meiner Wahl.

Mein Ziel ist zu verstehen, wie funktioniert es heutzutage? Wie weiß Trello, welche Karten vom Benutzer stammen? Wie Facebook weiß, welcher Beitrag dein ist? Wie filtern sie den Datensatz? Ist es normal, den Filter in jeder Abfrage zu machen? Haben sie das in der Datenbank oder in der Anwendung gemacht?

Antwort

0

Ich denke, zu viele Fragen werden in dieser einzelnen Stackoverflow Frage gestellt.Aber lassen Sie uns versuchen, die meisten von ihnen zu beantworten:

Row-Level-Security Das glaube ich nicht, dass Sie Sicherheit auf Zeilenebene für die Datenbank verwenden möchten. Dies wird nur benötigt, wenn Sie den Datenbenutzern direkten Zugriff auf die Datenbank geben. Wenn Sie den Zugriff nur über die API gewähren, können Sie die API die gesamte Filterung verarbeiten lassen (und die Möglichkeiten einschränken, wie sie diese abfragen können!). Normalerweise möchten Sie, dass Ihre Datenbank-Subventionen ziemlich statisch sind und nicht zulassen, dass der DBA die Rechte jedes Mal ändert (es sei denn, Sie haben nur ein paar große DB-Benutzer, die sich nicht oft ändern.).

Filter im Winterschlaf Ich bin von diesem verwirrt. Sie erwähnen SQL/Hibernate en Mongodb/Morphia. Zwei verschiedene Objektmapper für zwei verschiedene Datenbanktypen. Auch würde ich diese Option nicht "Filter by Hibernate" nennen. Nennen wir es "Filter nach API" und verwenden Sie eine facade design pattern. Die Fassadenklasse wird vor den Morphia- und Hibernate-APIs stehen und der API-Benutzer kann nur über diese API auf die Datenbank zugreifen.

Verwandte Themen