Frage

Ich habe auch darüber nachgedacht viel jetzt ohne offensichtlich richtige Lösung. Es könnte eine echte Holz-for-the-Bäume Situation, so dass ich die Stackoverflow Hilfe benötigen.

Ich versuche, Datenbank-Filterung auf regionaler Basis zu erzwingen. Mein System hat verschiedene Benutzer und jeder ist mit einem Regionalbüro zugeordnet. Ich möchte nur in der Lage sein Benutzer Daten zu sehen, die mit ihren regionalen Büro verbunden ist.

Einfach gesagt meine Anwendung ist: Java App -> JPA (Hibernate) -> MySQL

Die Datenbank enthält Objekt aus allen Regionen, aber ich möchte nur die Benutzer in der Lage sein, Objekte aus der eigenen Region zu manipulieren. Ich habe darüber nachgedacht, folgende Möglichkeiten, es zu tun:

1) ändern, dass alle Datenbank querys, so dass sie so etwas wie wählen Sie lesen * aus Tablex wo region = "MyRegion". Das ist fies. Es funktioniert nicht zu gut mit JPA zB die EntityManager.find () -Methode akzeptiert nur Primärschlüssel. Natürlich kann ich gehen nativer, aber ich habe nur auf eine Select-Anweisung verpassen und meine Sicherheit ist ein Schuss

2) verwenden, um einen MySQL Proxy-Ergebnisse zu filtern. Art von funky, aber dann die MySQL Proxy sieht nur die rohe Anruf und weiß nicht wirklich, wie es sie Filterung sein sollte (dh die Region der Benutzer, der diese Anforderung gemacht gehört). Ok, ich könnte einen Proxy für jede Region starten, aber es beginnt immer ein wenig chaotisch ..

3) verwenden getrennte Schemata für jede Region. ja, einfach, ich bin mit Feder, damit ich die RoutingDataSource routen die Anforderungen über die richtige Datenquelle (1 Datenquelle pro Schema) nutzen könnte. Des Kurses ist das Problem jetzt irgendwo auf der ganzen Linie nach Region und eine andere Kategorie filtern wollen, ich werde. OHP.

4) ACL - nicht wirklich sicher darüber. Wenn ein tat ein select * from Tablex; wäre es ruhig Objekte herauszufiltern Ich habe keinen Zugang zu oder wäre eine Last von Zugriffs Ausnahmen geworfen werden?

Aber bin ich zu viel darüber nachgedacht? Dies scheint wie ein wirklich gemeinsames Problem. Es muss eine einfache Lösung sein, ich bin einfach zu dumm, um zu sehen. Ich bin sicher, dass es etwas in der Nähe / oder in der Datenbank sein wird, wie Sie so nahe wie möglich Quelle filtern wollen, aber was?

Nicht zu Spoonfed suchen - alle Links, Keywords, Ideen, Handel / Open-Source-Produkt Vorschläge wirklich zu schätzen würden !! Dank.

War es hilfreich?

Lösung

Ich habe die Umsetzung gerade etwas ähnliches (Realbasic MySQL spricht) über die letzten paar Wochen für eine hierarchische Mehr Unternehmen Erweiterung eines Accounting-Paket.

Es gibt eine große Menge an vorhandenen Code, die SQL-Anweisungen komponiert, so dass wir damit zu leben hatten und nur eine Menge Revision tun die Beschränkungen, um sicherzustellen, gegebenenfalls in jeder Tabelle enthalten waren. Ein Gotcha war im Zusammenhang Lookups , wo Lookup-Tabellen wurden in der Regel nur in Kombination mit einem primären Tabelle verwendet, aber für einige Wartung GUIs würde laden Sie die Lookup-Tabelle selbst, direkt.

Es gibt eine Gefahr der impliziten Informationen verlosen wie aufschlussreich, dass Acme Pornostars ein Kunde von einem gewissen Bereich des Unternehmens ist; -)

Die einzige Lösung für diesen Teil war sehr sorgfältige Konstruktion der DB-Diagramme alle impliziten Beziehungen und viele Prüfungs- und greppen Quellcode zu zeigen, mit einem sorgfältigen Kommentierung Bereiche anzuzeigen, die als nicht benötigt zusätzliche Einschränkungen abgesegnet worden waren.

Das ein Muster, das ich habe kommen mit in Zukunft diese allgemeineren zu machen, anstatt explizit region = currentRegionVar Typ sucht, eine beliebige entityID verwendet, die von einer globalen CurrentEntityForRole ( „blah“) Funktion geliefert wird.

Diese Abstraktion für die gemeinsame Nutzung einiger Daten ermöglicht sowie die Umsetzung pseudo-Einheiten, die andere Restriktionsgrenzen darstellen.

Ich weiß nicht genug über Java und Spring in der Lage sein zu sagen, aber ist es eine Möglichkeit, Sie Ansichten, die ein Single-Schlüsselsuche zu schaffen nutzen könnten, wo die Aussicht durch die Region Filter eingeschränkt werden?

Der Wunsch Aggregationen und die gemeinsame Nutzung möglich, Daten zur Verfügung zu stellen war, warum wir nicht die separate Datenbank Weg gehen.

Andere Tipps

Gute Frage.

Scheint, wie # 1 ist die beste, da es die flexibelste ist.

Region passiert zu sein, was Sie heute sind Filterung, aber es könnte Region + Abteilung + Farbe der Haare morgen sein.

Wenn Sie beginnen, die Daten Zerstückelung zu viel scheint es, wie Sie stecken werden härter arbeiten als nötig, sie alle wieder zusammen für die Berichterstattung zu kleben.

Ich habe das gleiche Problem. Es ist schwer zu glauben, dass eine solche gemeinsame Aufgabe (Filtern einer Liste von Modelleinheiten basierend auf dem Benutzerprofil) hat keine ‚Standard‘ Art und Weise, Muster oder Best-Practice, es zu tun.

Ich habe pgacl , ein PostgreSQL-Modul. Grundsätzlich haben Sie Ihre Abfrage wie gewohnt, und dann heften Sie auf einem acl_access () Prädikat als Filter zu arbeiten.

Vielleicht gibt es etwas ähnliches für MySQL.

Ich schlage vor, Sie ACL zu verwenden. Es ist flexibler als andere Möglichkeiten. Verwenden Spring Security. Sie können es verwenden, ohne Spring Framework zu verwenden. Lesen Sie das Tutorial von Link-Text

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top