1

Temat: Uprawnienia

Witam.
Mam taki oto problem. Mam przykładową bazę która ma tabelkę klienci, w tej tabelce mam id_użytkownika, jego dane. Moje pytanie brzmi w jaki sposób, ewentualnie przydałby mi się jakiś przykład mogę nadać uprawnienia użytkownikowi do edycji tylko i wyłącznie swoich danych w tabeli.
Powiedzmy że użytkownik który loguj się do bazy jest "zapisany" w tej tabeli jako osoba z id_użytkownika=5 i może on tylko i wyłącznie widzieć swoje dane, edytować i usuwać. Nie może on mieć wglądu do danych innych osób.

2

Odp: Uprawnienia

No to rozwiązania mogą być takie
Zabierasz użytkownikom wszelkie prawa do aktualizacji tabel
1)tworzysz funkcję (z opcją SECURITY DEFINER) za pomocą której będzie można aktualizować tabele. W samej funkcji definiujesz żeby użytkownik mógł zmieniać tylko swoje dane (albo poprzez jakiś warunek IF albo poprzez doklejanie do zapytań warunku userid=<identyfikator uzytkownika>)
2) Definiujesz widoki na tabelach i definiujesz na nich reguły (RULE) typu INSTEAD aby podczas próby aktualizacji widoku była aktualizowana określona tabela i tu też pewnie da się do polecenia aktualizującego dodac warunek userid=<identyfikator uzytkownika>

Jasno się wysłowiłem smile? Czy potrzebny będzie Ci jakiś przykład?

3

Odp: Uprawnienia

Jeżeli byłby tylko możliwy przykład byłbym naprawdę bardzo wdzięczny.

4

Odp: Uprawnienia

Tabela z mapowaniem nazwa_uzytkownika <-> id uzytkownika

create table users(username text, userid int);
insert into users values('dbuser',1);

Tabela z danymi uzytkownikow kazdy moze edytowac tylko swoje dane

create table data(userid int, address text);
insert into data values(1,'ulica dbusera');
insert into data values(2,'ulica innego dbusera');


revoke insert,update,delete on data from public;
revoke insert,update,delete on data from dbuser;

Widok i reguły za pomocą których będą wykonywane update'y i delete'y na tabeli

create view _data as select * from data;

grant insert,update,delete,select on _data to public;

create rule r_update as on update to _data do instead
update data set address=NEW.address where userid in (select userid from
users where username=user);

create rule r_delete as on delete to _data do instead
delete from data where userid in (select userid from users where
username=user);

No i jak uzytkownik wykona takiego update'a

update _data set address='nowy user dbuser';

to reguła (w tym wypadku reguła r_update) doklei do niego warunek 'userid in (...)'

Jeśli w twoim przypadku użytkownik to to samo co użytkownik bazy danych to
możesz zrezygnować z identyfikatorów użytkowników i tabeli z mapowaniem i uprości się warunek w regułach do czegoś w stylu 'username=current_user' (username byłoby zamiast userid)

To taki przykład na prędko, który nie koniecznie zadziała gdy użytkownik wykona na przykład update z warunkiem WHERE (należałoby troche zmodyfikowac reguły żeby to zadziałało). Ale ponieważ ja leniwy jestem z reguły i ciężko mi się jest zmusić do wolontariatu  smile to nie chce mi się tego robić. Zresztą przecież to sama frajda rozwiązywać problemy nie smile ?
Rozwiązania z procedurami nie zamieszczam bo też trochę z tym roboty (trochę, znaczy więcej niż z regułami).