Rechteverwaltung für ORACLE Server
Armin Kast
Rechteverwaltung im ORACLE-Server in der Praxis
Rechte auf Tabellen
Damit ein Anwender mittels Clientsoft-ware auf einen ORACLE Server zugreifen kann, benötigt dieser Rechte auf die Da-tenbank und die darin enthaltenen Tabel-len. Diese Rechte können in unterschied-lichster Art vergeben werden. Entweder man verwendet die visuellen Werkzeuge des ORACLE Servers wie z.B. den Enter-prise Manager oder man schreibt ein Script mit welchem dann die darin verankerten Rechte zum ORACLE Server übertragen werden. Wie auch immer die Rechte auch auf den ORACLE Server gekommen sind, vielfach möchte man diese auch wieder auslesen und prüfen ob ein Nutzer auch wirklich die gültigen Rechte besitzt. Hier-zu müssen wird auf die Systemobjekte (Ansichten und Tabellen) des ORACLE Servers zurückgreifen und die dort gespei-cherten Rechte auslesen. Die Rechte auf die Tabellen eines Anwenders stehen in Systemtabellen des ORACLE Servers. Die Vorgehensweise ist folgende. Zuerst müs-sen wir wissen welcher Anwender sich am System angemeldet hat. Dies erfahren wir mittels Abfrage SELECT user FROM dual. Im weiteren Verlauf können wir dann die Rechte des Anwenders über die Ansicht USER_TAB_PRIVS ermitteln.
SELECT Table_name,
MAX(INSTR(Privilege,'SELECT')) AS SEL,
MAX(INSTR(Privilege,'INSERT')) AS INS,
MAX(INSTR(Privilege,'DELETE')) AS DEL,
MAX(INSTR(Privilege,'UPDATE')) AS UPDT
FROM user_tab_privs WHERE GRANTEE IN ( SELECT user FROM dual )
GROUP BY Table_name;
Hiermit werden die Rechte, welcher der Anwender auf Tabellen besitzt, ausgelesen und für jede Tabelle in einer Zeile (Tupel) angezeigt. Steht in der jeweiligen Spalte (Attribut) eine 1 so hat der Anwender das Recht. Ein 0 signalisiert fehlendes Recht. Allerdings kann die Art der Darstellung durch nachfolgende Abfrage (BIT-Darstellung) wesentlich vereinfacht wer-den. In der Bitreihe 8 4 2 1 ( 2^3 2^2 2^1 2^0 ) setzen wir SELECT = 2^0 = 1 , INSERT = 2^1 = 2 , DELETE = 2^2 = 4 und UPDATE = 2^3 = 8. Diese Reihe liesse sich leicht für weitere Berechtigungen erweitern. So lassen sich die Rechte in einer Spalte zusammenfassen. In einer Applikation brauchte man nun, wenn alle Rechte gefordert sind, den Wert 15 abzufragen ( SEL + INS + DEL + UPDT = 1 + 2 + 4 + 8 = 15 ). Hat der Anwender keine 15, so sind die erforderliche Rechte nicht an ihn vergeben! In VFP kann dieser Wert mittel INT() und BITAND() Funktion wieder ausgelesen werden. Wollen wir z.B. das UPDATE- Recht prüfen so schreiben wir INT(BITAND( 15 , 8 )/8). 15 ist das Ergebnis welches die Abfrage liefern könnte und 8 das zu prüfende BIT ( 2^3 ) für das UPDATE Recht. Ist das Ergebnis eine 1 so ist an dieser Stelle ein BIT gesetzt und der Anwender hat das Recht. Ist das Ergebnis eine 0 so existiert kein UPDATE Recht.
Bitweise Darstellung der Werte (Rechte)
SELECT Table_name,
MAX(INSTR(Privilege,'SELECT')) * POWER(2,0) +
MAX(INSTR(Privilege,'INSERT')) * POWER(2,1) +
MAX(INSTR(Privilege,'DELETE')) * POWER(2,2) +
MAX(INSTR(Privilege,'UPDATE')) * POWER(2,3) AS Recht
FROM user_tab_privs
WHERE GRANTEE IN ( SELECT user FROM dual )
GROUP BY Table_name
Um die Rechte des Anwenders auch im Falle einer Rollenzugehörigkeit zu erhal-ten, erweitern wir die Abfrage um die Rol-len (session_roles). Es werden die Einzelrechte und alle Rechte auf Tabellen aller Rollen, welchen der Anwender ange-hört, ausgelesen und das höchste ermittelte Recht in der Ergebnismenge dargestellt.
SELECT Table_name,
MAX(INSTR(Privilege,'SELECT')) * POWER(2,0) +
MAX(INSTR(Privilege,'INSERT')) * POWER(2,1) +
MAX(INSTR(Privilege,'DELETE')) * POWER(2,2) +
MAX(INSTR(Privilege,'UPDATE')) * POWER(2,3) AS Recht
FROM all_tab_privs
WHERE GRANTEE IN ( SELECT role FROM session_roles )
OR GRANTEE IN ( SELECT user FROM dual )
GROUP BY Table_name
In Oracle muss ein Anwender eine Tabelle mit DBOName.TabellenName ansprechen. Um dies zu vereinfachen richtet man für den Anwender ein Synonym ein. Dadurch ist der Anwender in der Lage die Tabelle durch dieses Synonym anzusprechen. Nehmen wir an die Tabelle KUNDEN ge-hört dem Anwender MASTER. Somit muss ein Anwender die Tabelle mit MASTER.KUNDEN ansprechen. Wird nun ein Synonym KUNDEN eingerichtet, wel-ches für MASTER.KUNDEN steht kann der Anwender diese Tabelle mit KUNDEN ansprechen. Hierzu werden aus der Ansicht USER_SYNONYM die Synonyme des Anwenders gelesen und mit in die WHERE Klausel integriert. Es wird vor-ausgesetzt das die Synonyme gleich der Tabellennamen sind. Somit werden in der Rechteanzeige die Synonyme berücksich-tigt. Fehlt das Synonym so wird die Tabel-le in der Liste nicht erscheinen obwohl der Anwender hierauf vielleicht verschiedene Rechte besitzt !
SELECT Table_name,
MAX(INSTR(Privilege,'SELECT')) * POWER(2,0) +
MAX(INSTR(Privilege,'INSERT')) * POWER(2,1) +
MAX(INSTR(Privilege,'DELETE')) * POWER(2,2) +
MAX(INSTR(Privilege,'UPDATE')) * POWER(2,3) AS Recht
FROM all_tab_privs
WHERE ( GRANTEE IN ( SELECT role FROM session_roles ) OR
GRANTEE IN ( SELECT user FROM dual ) )
AND ( Table_Name IN
( SELECT Synonym_Name FROM User_synonyms ) )
|