Zugriffsrechte richtig vergeben?

DaSt1988

Benutzer
Beiträge
13
In einer alten Prüfung sollte man Zugriffsrechte vergeben. Ich bin mir nicht sicher ob das so stimmt was ich gemacht habe.

Es gibt die Tabellen: (Erstes Attribut in der Zeile ist jeweils der PK)

KFZ: Nr, Fahrgestellnr, KZ, Marke etc...
Händler: Hnr, Firmenname, Email, Telnr, Adresse
Filiale: Filialnr, Ort, Strasse, Nr, Firmenname
Verkauf: Verkaufsnr, KFZ, ....

Aufgabe: (Die jeweiligen Farben sollen den zur Aufgabenstellung gehörenden Befehl darstellen)

Jeder beteiligte KFZ-Händler erhält eine eigene Kennung. Beispielsweise bekommt der Händler mit dem HändlernamenSchmidtKFZ mit der Händlernummer (Hnr) 1013 die Kennung SchmidtKFZ. Mit dieser Kennung kann er auf die Relationen KFZ und Verkauf voll lesend zugreifen und bis auf die Daten der anderen Händler auch auf die Relationen Händler und Filiale. Die Leserechte auf KFZ und Verkauf darf er an Dritte weitergeben.Alle Daten zu seiner Filiale darf er beliebig bearbeiten. Bei den Händlerdaten darf er nur die Email, die Telefonnummer und die Adresse ändern. Weitere Schreibrechte erhält er nicht.
Vergeben Sie genau die dazu benötigten Zugriffsrechte:


GRANT SELECT ON KFZ TO SCHMIDTKZF WITH GRAND OPTION
GRANT SELECT ON VERKAUF TO SCHMIDTKFZ WITH GRAND OPTION


//Hier bin ich mir nicht sicher ob man das so machen kann??
GRANT UPDATE,DELETE,INSERT ON HÄNDLER(SCHMIDTKFZ) TO SCHMIDTKFZ

GRANT UPDATE(Email, Telnr, Adresse) ON HÄNDLER TO SCHMIDTKFZ

//Habe nicht gewusst was mit "bis auf die Daten der anderen Händler" gemeint war
//Deswegen habe ich beim Händler und der Filiale einfach mal den PK weggelassen
CREATE VIEW VHÄNDLER AS
SELECT Firmenname, Email, Telnr, Adresse
FROM Händer;

GRANT SELCT ON VHÄNDLER TO SCHMIDTKFZ

CREATE VIEW VFILIALE AS
SELECT Ort, Strasse, Nr, Firmenname
FROM Filiale;

GRANT SELECT ON VFILIALE TO SCHMIDTKFZ
 
Werbung:
Prinzipiell solltest Du erst einmal mit Revoke Rechte wegnehmen.

Ansonsten: hast Du es mal probiert? Ob Dein View Sinn macht bezweifle ich aber erheblich - für sowas brauchst Du Row Level Security. Ob das Oraggle kann weiß ich nicht - kann schon sein. Aber da wirst Du sicher den aktuellen User mit in die Definition einbeziehen müssen.

Ich kann Dir all das zeigen - aber nur mit PostgreSQL.
 
danke für die antwort. Zum View... unser Prof stellt jedes Semester von der Art her die selben Aufgaben und eine davon ist immer die Zugriffsrechte zu vergeben. Er hat uns gesagt, wenn ein Select eingeschränkt werden soll (wie hier) sollen wir eine View erstellen mit den Attributen die gesehen werden dürfen. Von Row Level Security habe ich noch wie was gehört. Wenn Revoke gewünscht ist, dann steht das explizit dabei.Bei uns ist das ja eine Grundlagenveranstalltung..die meisten fangen bei 0 an und auf 4 Monate ist nicht so viel zu lernen. Und wir behandeln nur Oracle und keine andere DB.
 
Ich verstehe den Punkt " und bis auf die Daten der anderen Händler auch auf die Relationen Händler und Filiale. " so, daß er nur seine eigenen Daten sehen darf. Das bewirkt Dein View nicht.

RLS geht so, um es mal ganz schnell zu zeigen:

Code:
test=# create table data(id int primary key, u text, data text);
CREATE TABLE
test=*# insert into data values (1, 'user_1', 'daten user 1');
INSERT 0 1
test=*# insert into data values (2, 'user_2', 'daten user 2');
INSERT 0 1
test=*# insert into data values (3, 'user_3', 'daten user 3');
INSERT 0 1
test=*# grant select on data to public;
GRANT
test=*# alter table data enable row level security;
ALTER TABLE
test=*# create policy nur_eigene_daten on data for select using (u = current_user);
CREATE POLICY
test=*# commit;
COMMIT
test=# select * from data;
 id |  u  |  data   
----+--------+--------------
  1 | user_1 | daten user 1
  2 | user_2 | daten user 2
  3 | user_3 | daten user 3
(3 Zeilen)

Was ist bisher passiert?

Ich habe eine Tabelle erstellt und Daten eingefügt. Voher hatte ich noch die User user_1, user_2 und user_3 erstellt. Die Spalte u enthält den Usernamen, der diese Zeile sehen darf.
Dann habe ich via alter table RLS eingeschaltet und eine Policy erstellt, wer was sehen darf - das ist hier im Beispiel sehr simpel - der aktuelle Usernamen muß mit der Spalte u identisch sein.

Und nun alles zusammen:

Code:
test=*# set role user_2;
SET
test=*> select * from data;
 id |  u  |  data   
----+--------+--------------
  2 | user_2 | daten user 2
(1 Zeile)

Als User user_2 sehe ich so nur noch das, was ich sehen darf. Mehr nicht. That's RLS - Row Level Security.

Ein View schränkt lediglich die sichtbaren Spalten ein, oder aber auch Zeilen, wenn eine Where-Condition vorliegt. Es kann Dir aber keiner verbieten, statt dem View die dem View zugrunde liegende Tabelle abzufragen. Zugriffsbeschränkung geht also anders.
 
Werbung:
Zurück
Oben