Nie ma „uprawnień do SELECT ". Wszystko czego potrzebujesz to uprawnienie do WYKONAJ Funkcje. Odpowiednia funkcja może działać z SECURITY DEFINIERA
odziedziczyć wszystkie przywileje właściciela. Aby ograniczyć możliwą eskalację uprawnień do minimum a priori, spraw, aby rola demona posiadała odpowiednie funkcje tylko z niezbędnymi uprawnieniami - nie jako superużytkownik!
Przepis
Jako superużytkownik...
Utwórz rolę niebędącą superużytkownikiem mójużytkownik .
CREATE ROLE myuser PASSWORD ...;
Utwórz rolę grupową mojagrupa i utwórz mójużytkownik członek w nim.
CREATE ROLE mygroup;
GRANT mygroup TO myuser;
Możesz dodać więcej użytkowników, tak jak myuser później.
Nie przyznawaj żadnych uprawnień do mojego użytkownika .
Przyznaj je tylko do mojagrupa :
UZNAJ POŁĄCZENIE Z BAZY DANYCH mydb DO mygroup;ZGODA NA WYKORZYSTANIE SCHEMATU public DO mygroup;ZEZWOLENIE NA WYKONANIE FUNKCJI foo() DO mygroup;
Usuń wszystkie uprawnienia dla public ten mójużytkownik nie powinien.
REVOKE ALL ON ALL TABLES IN SCHEMA myschema FROM public;
Może być więcej. Cytuję instrukcję:
Utwórz rolę demona do własności odpowiednie funkcje.
CREATE ROLE mydaemon;
Przyznaj mydaemonowi tylko uprawnienia niezbędne do wykonania tych funkcji , (w tym WYKONAJ FUNKCJĘ aby umożliwić wywołanie innej funkcji). Ponownie, możesz użyć ról grupowych, aby połączyć uprawnienia i przyznać je mydaemonowi
GRANT bundle1 TO mydaemon;
Ponadto możesz użyć DOMYŚLNE UPRAWNIENIA
aby automatycznie nadać pewne uprawnienia dla przyszłych obiektów bezpośrednio do pakietu lub demona:
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT SELECT ON TABLES TO bundle1;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT USAGE ON SEQUENCES TO bundle1;
Dotyczy to tylko roli, dla której jest wykonywany. Zgodnie z dokumentacją:
Aby objąć również istniejące wcześniej obiekty w schemacie (patrz komentarz Roba ):
GRANT SELECT ON ALL TABLES IN SCHEMA public TO bundle1;
GRANT USAGE ON ALL SEQUENCES IN SCHEMA public TO bundle1;
Utwórz mydaemona własne odpowiednie funkcje. Może wyglądać tak:
CREATE OR REPLACE FUNCTION foo()
...
SECURITY DEFINER SET search_path = myschema, pg_temp;
ALTER FUNCTION foo() OWNER TO mydaemon;
REVOKE EXECUTE ON FUNCTION foo() FROM public;
GRANT EXECUTE ON FUNCTION foo() TO mydaemon;
GRANT EXECUTE ON FUNCTION foo() TO mygroup;
-- possibly others ..
###Note
Z powodu tego błędu
w aktualnej wersji 1.16.1 pgAdmin
niezbędne polecenie
REVOKE EXECUTE ON FUNCTION foo() FROM public;
brakuje w skrypcie DDL poddanym inżynierii wstecznej. Pamiętaj, aby dodać go podczas odtwarzania.
Ten błąd został naprawiony w obecnej wersji pgAdmin 1.18.1.