Frage

ich auf eine Anwendung arbeite, die Oracle in Authentifizierungsmechanismen eingebaut verwendet, um Benutzerkonten und Passwörter zu verwalten. Die Anwendung nutzt auch auf Zeilenebene Sicherheit. Grundsätzlich wird jeder Benutzer, der durch die Anwendung registriert, erhält einen Oracle-Benutzername und Passwort, anstatt den typischen Eintrag in einer „Benutzer“ Tabelle. Der Anwender erhält auch Etiketten auf bestimmte Tabellen. Diese Art von Funktionalität erfordert, dass die Ausführung von DML und DDL-Anweisungen in vielen Fällen kombiniert werden, aber dies stellt ein Problem dar, weil die DDL-Anweisungen implizite Commits auszuführen. Wenn ein Fehler auftritt, nachdem eine DDL-Anweisung ausgeführt hat, wird das Transaktionsmanagement nicht alles wieder rollen. Zum Beispiel, wenn ein neuer Benutzer mit dem System registriert könnte folgende stattfinden:

  1. Starten Sie die Transaktion
  2. Einfügen Person Details in einer Tabelle. (Das heißt Vorname, Nachname, etc.) -DML
  3. Erstellen Sie eine Oracle-Konto (erstellen Benutzer Testuser mit Passwort identifiziert;) -DDL implizite begehen. Verhandlung beendet.
  4. Neue Transaktion beginnt.
  5. Führen Sie mehr DML statments (Einfügungen, Aktualisierungen usw.).
  6. Der Fehler tritt auf, Transaktion nur rollt zurück zu Schritt 4.

Ich verstehe, dass die obige Logik so ausgelegt ist, zu arbeiten, aber ich bin es schwierig, Unit-Test diese Art von Funktionalität zu finden und sie in Datenzugriffsschicht verwalten. Ich habe wieder die Datenbank nach unten gehen oder Fehler auftreten, während der Unit-Tests, die das Testschema verursacht mit Testdaten verunreinigt zu sein, die gerollt werden sollte. Es ist einfach genug, um das Testschema zu wischen, wenn dies geschieht, aber ich mache mir Sorgen um Datenbankausfälle in einer Produktionsumgebung. Ich bin für Strategien suchen, dies zu verwalten.

Dies ist eine Java / Frühjahr Anwendung. Der Frühling ist die Bereitstellung des Transaktionsmanagements.

War es hilfreich?

Lösung

Sie sollten sich mit Sicherheit auf Zeilenebene in Kombination Oracle-Proxy-Authentifizierung verwenden.

Lesen Sie diese: http://www.oracle. com / Technologie / pub / articles / Dikmans-toplink-security.html

Andere Tipps

Als erstes muss ich sagen: schlechte Idee, es auf diese Weise zu tun. Aus zwei Gründen:

  1. Verbindungen werden auf Benutzer basiert. Das heißt, Sie weitgehend die Vorteile des Connection-Pooling verlieren. Es ist auch nicht schrecklich gut skalieren. Wenn Sie 10.000 Benutzer auf auf einmal haben, wirst du ständig öffnen und schließen harte Verbindungen sein (und nicht weichen Verbindungspools); und
  2. Wie Sie entdeckt haben, das Erstellen und Entfernen von Benutzern ist DDL nicht DML und somit verlieren Sie „Transaktionalität“.

Nicht sicher, warum Sie sich entschieden haben es, dies zu tun, aber ich würde stark empfehlen Sie Benutzer bei der Anwendung implementieren und nicht die Datenbankschicht.

Was, wie Ihr Problem zu lösen, im Grunde kann man nicht. Das gleiche wie wenn Sie eine Tabelle oder einen Index in der Mitte der Sequenz wurden zu schaffen.

Ich werde mit einigen der vorherigen Kommentare widersprechen und sagen, dass viele Vorteile bei der Verwendung des eingebauten in Oracle Account-Sicherheit gibt. Wenn Sie dieses von Benutzern mit einer Art Schattentabelle erweitern mit zusätzlichen Informationen, wie über die Oracle-Account-Erstellung in einem separaten Paket Verpackung, die PRAGMA AUTONOMOUS_TRANSACTION deklariert wird und gibt einen Erfolg / Missstand zu dem Paket, das den Einsatz tut in die Schattentabelle? Ich glaube, das die Oracle-Account-Erstellung aus der Transaktion isolieren würde.

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