Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Zugriffsrechte richtig vergeben?

Dieses Thema im Forum "Oracle" wurde erstellt von DaSt1988, 14 Juni 2016.

  1. DaSt1988

    DaSt1988 Benutzer

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  3. DaSt1988

    DaSt1988 Benutzer

    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.
     
  4. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  5. DaSt1988

    DaSt1988 Benutzer

    danke..
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden