Ich habe darüber jetzt zu viel nachgedacht, ohne offensichtlich korrekte Lösung. Es könnte eine echte Holz-für-die-Bäume-Situation sein, also brauche ich stackoverflow-Hilfe.Wie man den Datenbankzugriff entsprechend den Anwendungsanwenderattributen einschränkt oder filtert
Ich versuche, Datenbankfilterung auf regionaler Basis zu erzwingen. Mein System hat verschiedene Benutzer und jeder ist einem regionalen Büro zugeordnet. Ich möchte nur, dass Benutzer Daten sehen können, die mit ihrem regionalen Büro verknüpft sind.
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 über die folgenden Möglichkeiten, es zu tun:
1) ändern Sie alle Datenbankabfragen, so dass sie etwas wie Select * aus Tabellex wo Region = "myregion" lesen. Das ist eklig. Es funktioniert nicht gut mit JPA zB die Methode entitymanager.find() akzeptiert nur Primärschlüssel. Natürlich kann ich native gehen, aber ich muss nur eine Select-Anweisung verpassen und meine Sicherheit wird geschossen
2) Verwenden Sie einen MySQL-Proxy, um Ergebnisse zu filtern. irgendwie funky, aber dann sieht der mysql proxy nur den rohen call und weiß nicht wirklich wie er sie filtern soll (dh in welcher region der benutzer, der diese anfrage gemacht hat). Ok, ich könnte einen Proxy für jede Region starten, aber es beginnt ein wenig unordentlich.
3) Verwenden Sie separate Schemas für jede Region. Ja, ich benutze Spring, damit ich die RoutingDataSource verwenden kann, um die Anfragen über die richtige Datenquelle (1 Datenquelle pro Schema) zu routen. Natürlich ist das Problem jetzt irgendwo auf der Linie, ich werde nach Region und einer anderen Kategorie filtern wollen. ohs.
4) ACL - nicht wirklich sicher darüber. Wenn a hat eine Auswahl * von tablex; Würde es Objekte, für die ich keinen Zugriff habe, ruhig ausfiltern oder würde eine Menge von Zugriffsausnahmen ausgelöst werden?
Aber denke ich zu viel darüber nach? Dies scheint ein wirklich häufiges Problem zu sein. Es muss eine einfache Lösung geben, ich bin einfach zu dumm um es zu sehen. Ich bin mir sicher, dass es etwas in der Nähe der Datenbank oder in der Datenbank sein wird, da Sie so nah wie möglich an der Quelle filtern möchten, aber was?
Nicht suchen, spoonfed zu sein - irgendwelche Verbindungen, Schlüsselwörter, Ideen, kommerzielle/opensource Produktvorschläge würden wirklich geschätzt !! Vielen Dank.
Dies scheint eine der Situationen zu sein, in denen es sich ausgezahlt hat, Ihre eigene DAL zu schreiben, aber ich denke, dass es für Sie nicht in Frage kommt. Es scheint, dass Sie sie auf der Geschäftsebene heraus filtern müssen. Große Frage, ich hoffe, dass jemand hier mit einer guten Antwort kommt. –
Zum Glück habe ich eine sehr saubere DAL ... also # 1 sieht aus wie der Weg nach vorne. Ich möchte nur in der Lage sein, die Nutzung der DAL zu erzwingen, da ein Entwickler in der Zukunft entscheiden könnte, es zu umgehen. –