Ich evaluiere derzeit Authentifizierungs- / Autorisierungs-Frameworks.
Apache Shiro scheint sehr nett zu sein, aber ich bin fehlende Sicherheit auf Zeilenebene .
z. Es könnte spezielle Zeilen in einer Datenbank geben, die nur für Benutzer mit besonderen Rechten sichtbar und zugänglich sein sollten. Um unnötige Roundtrips zu vermeiden, modifizieren wir derzeit die SQL-Abfragen so, dass sie mit unseren Autorisierungsdaten verknüpft werden, um nur die sichtbaren Zeilen für den aktuellen Benutzer zu erhalten.
Aber dieses Konzept fühlt sich für mich nicht "richtig" an, weil wir Geschäftscode mit sicherheitsbezogenem Code mischen, der orthogonal und unabhängig voneinander sein sollte.
UPDATE:
Zieldatenbank ist meistens Oracle 10g / 11g
- aber eine datenbankunabhängige Lösung wäre zu bevorzugen, wenn es keine großen Nachteile gibt.
Die Sicherheit auf Zeilenebene wird am besten in der Datenbank selbst ausgeführt. Der Datenbank muss mitgeteilt werden, was Ihr Benutzerkontext ist, wenn Sie eine Verbindung herstellen. Dieser Benutzer ist einer oder mehreren Sicherheitsgruppen zugeordnet. Die Datenbank hängt dann automatisch Filter an von Benutzern bereitgestellte Abfragen an, um herauszufiltern, was von den Sicherheitsgruppen nicht gesehen werden kann. Dies bedeutet natürlich, dass dies eine Lösung pro Datenbank ist.
Oracle hat eine ziemlich gute Row Level Security-Unterstützung, siehe Ссылка als Beispiel.
Wir haben es als JDBC-Wrapper implementiert. Dieser Wrapper analysiert und transformiert SQL einfach. Der Hibernate-Filter ist ebenfalls eine gute Idee, aber wir haben viele Berichte und Ad-hoc-Abfragen. Hibernate ist nicht das einzige Werkzeug, um auf Daten in unseren Anwendungen zuzugreifen. jsqlparser ist ein ausgezeichneter Open-Source-SQL-Parser, aber wir müssen ihn aufteilen, um einige Probleme zu beheben und die Unterstützung einiger fortgeschrittener SQL-Funktionen hinzuzufügen, z. ROLLUP für Berichterstattungszwecke Ссылка Dieses Berichtstool ist auch auf GitHub verfügbar, es besteht jedoch keine Abhängigkeit von der Sicherheitsinfrastruktur auf Zeilenebene Ссылка
Es gibt einen hilfreichen Artikel: Ссылка
Die Idee besteht darin, dass Sie die Funktionen auf Zeilenebene auf zwei Arten implementieren können: direkte Einstellung von Einschränkungen in Ihrem Repository oder Bindung der Einschränkungen über AOP. Letzteres wird bevorzugt, da die Sicherheitsschicht von der Geschäftslogik getrennt werden sollte (orthogonale Probleme).
In Hibernate können Sie das Konzept von Filtern verwenden, die transparent angewendet werden und das Repository nicht darüber informiert. Sie können solche Filter über AOP hinzufügen. Der andere Weg ist das Abfangen von session.createCriteria () und das Hinzufügen von Restriktionen zu den Kriterien durch Verwendung von AOP.
Tags und Links sql java security shiro row-level-security