Ergebnis 1 bis 3 von 3

Thema: Nur Zugriff auf bestimmte Funktionen erlauben

  1. #1
    Sigh ist offline Benutzer
    Registriert seit
    12.09.2008
    Ort
    Köln
    Beiträge
    69

    Standard Nur Zugriff auf bestimmte Funktionen erlauben

    hallo zusammen,

    ich möchte die Zugriffe auf meine Datenbank "kapseln".

    Ich habe mehrere Tabellen und mehrere Funktionen.

    Ich möchte einen user anlegen der nur selects auf die tabellen machen kann UND SELECT * from func (also selbst definierte funktionen ausführen)

    in der func allerdings geht es heiss her. insert, delete, update, create usw. usw.

    ist das möglich ?

    Ziel ist das Änderungen der Daten (insert, delete, creaste, updates) nur über die gekapselten funktionsaufrufe möglich sind.

    oder muss ich dem user execute func rechte geben und in der function die grants immer wieder anpassen ? und kann ich überhaupt auf den aktuellen benutzer über eine variable innerhalb pl/pgsql zugreifen um das machen zu können ?

    Für hilfreiche tipps bin ich dankbar.

  2. #2
    akretschmer ist gerade online Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von Sigh Beitrag anzeigen
    hallo zusammen,

    ich möchte die Zugriffe auf meine Datenbank "kapseln".

    Ich habe mehrere Tabellen und mehrere Funktionen.

    Ich möchte einen user anlegen der nur selects auf die tabellen machen kann UND SELECT * from func (also selbst definierte funktionen ausführen)

    in der func allerdings geht es heiss her. insert, delete, update, create usw. usw.

    ist das möglich ?

    Ziel ist das Änderungen der Daten (insert, delete, creaste, updates) nur über die gekapselten funktionsaufrufe möglich sind.

    oder muss ich dem user execute func rechte geben und in der function die grants immer wieder anpassen ? und kann ich überhaupt auf den aktuellen benutzer über eine variable innerhalb pl/pgsql zugreifen um das machen zu können ?

    Für hilfreiche tipps bin ich dankbar.

    Du kannst als Superuser oder Besitzer der Tabelle eine Funktion mit 'security definer' schreiben, der auf der Tabelle arbeiten darf.

    Mal grob:

    Szenario: ich bin in meiner Testdatenbank

    Code:
    test=# select * from foo;
     id |    name            
    ----+-------------       
      1 | batzenlurch        
      2 | akretschmer        
      3 | ads                
    (3 rows)                 
    
    test=*# create or replace function update_foo(int, text) returns bool as $$begin update foo set name = $2 where id=$1; return 1;end;$$language plpgsql security definer;
    CREATE FUNCTION                                                                                                                                                         
    test=*# commit;                                                                                                                                                         
    COMMIT                                                                                                                                                                  
    test=# \q                                                                                                                                                               
    kretschmer@tux:~$ psql -U gast test                                                                                                                                     
    psql: FATAL:  role "gast" does not exist                                                                                                                                
    kretschmer@tux:~$ createuser gast
    Shall the new role be a superuser? (y/n) n
    Shall the new role be allowed to create databases? (y/n) n
    Shall the new role be allowed to create more new roles? (y/n) n
    kretschmer@tux:~$ psql -U gast test                            
    Welcome to psql 8.3.6, the PostgreSQL interactive terminal.    
    
    Type:  \copyright for distribution terms
           \h for help with SQL commands    
           \? for help with psql commands   
           \g or terminate with semicolon to execute query
           \q to quit                                     
    
    test=> select * from foo;
    ERROR:  permission denied for relation foo
    test=!> rollback;                         
    ROLLBACK
    test=> select * from update_foo(2, 'Tamara');
     update_foo
    ------------
     t
    (1 row)
    
    test=*> commit;
    COMMIT
    test=> \q
    kretschmer@tux:~$ psql test
    Welcome to psql 8.3.6, the PostgreSQL interactive terminal.
    
    Type:  \copyright for distribution terms
           \h for help with SQL commands
           \? for help with psql commands
           \g or terminate with semicolon to execute query
           \q to quit
    
    test=# select * from foo;
     id |    name
    ----+-------------
      1 | batzenlurch
      3 | ads
      2 | Tamara
    (3 rows)
    Der aktueller Benutzer ist übrigens:

    Code:
    test=> select current_user;
     current_user
    --------------
     gast
    (1 row)

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  3. #3
    Sigh ist offline Benutzer
    Registriert seit
    12.09.2008
    Ort
    Köln
    Beiträge
    69

    Standard

    Spitzenmäßig

    Astreines HowTo

    Vielen lieben Dank

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum