Pytanie Jak przyznać wszystkie uprawnienia do widoków arbitralnemu użytkownikowi


W jaki sposób przyznać dostęp do odczytu / wyboru dla wszystkich funkcji i widoków dowolnemu użytkownikowi?

używam psql --user=postgres -d mydb -f myview.sql utworzyć kilka funkcji i widoków, a następnie uruchomić:

GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;

Otrzymawszy wszystkie przywileje, oczekiwałbym myuser mieć teraz dostęp do funkcji i widoków utworzonych przez postgres użytkownik. Jednak gdy próbuję uzyskać do nich dostęp myuser, Pojawia się błąd "odmowa uprawnień dla relacji ...". Dlaczego to?


21
2018-05-08 01:07


pochodzenie




Odpowiedzi:


Powodem jest to, że potrzebujesz dodatkowych uprawnień, aby uzyskać dostęp do widoku lub tabeli. Uprawnienia w bazie danych nie obejmują dostępu do wszystkich znajdujących się w niej obiektów.

Różni się on funkcjami: EXECUTE przyznano przywilej public domyślnie. Ale funkcja jest wykonywana z uprawnieniami bieżącego użytkownika. Możesz być zainteresowany SECURITY DEFINER modyfikator dla CREATE FUNCTION. Ale zwykle wystarczy to przyznać SELECT na zaangażowanych tabelach.

Zgodnie z dokumentacją dotyczącą przywilejów domyślnych:

W zależności od typu obiektu, mogą to być początkowe uprawnienia domyślne   obejmują przyznanie niektórym przywilejom PUBLIC. Wartość domyślna nie jest publiczna   dostęp do tabel, kolumn, schematów i obszarów tabel; CONNECT   przywilej i TEMP uprawnienie do tworzenia tabel dla baz danych; EXECUTE   przywilej funkcji; i USAGE przywilej dla języków.

Możesz być zainteresowany tym poleceniem DDL (wymaga Postgres 9.0 lub później):

GRANT SELECT ON ALL TABLES IN SCHEMA public TO myuser;

Podczas połączenia z daną bazą danych oczywiście (zob @ Marcel's comment poniżej) oraz jako użytkownik z odpowiednimi uprawnieniami. Możesz być także zainteresowany tym ustawieniem DEFAULT PRIVILEGES:

Bardziej szczegółowa odpowiedź na pytanie, jak zarządzać uprawnieniami:

pgAdmin ma funkcję dla bardziej wyrafinowanych operacji zbiorczych:

enter image description here

Lub możesz zapytać katalogi systemowe, aby utworzyć instrukcje DDL dla masowego nadawania / cofania ...


27
2018-05-08 01:18



Zajęło mi to godzinę, aby uświadomić sobie, że "WYBÓR DOTACJI NA WSZYSTKICH TABELACH W SCHEMA public to myuser"; Ma sens tylko wtedy, gdy to polecenie zostanie wykonane, gdy nadawcą jest użytkownik POŁĄCZONY do tej bazy danych. Jeśli nie, to po prostu nic nie robi (a przynajmniej nie daje uprawnienia wyboru użytkownikowi). W powłoce superużytkownika użyj nazwy \ c databasename. - marcel
@marcel: Dodałem notatkę, aby przypomnieć ludziom. - Erwin Brandstetter
To nie nadaje użytkownikowi uprawnień do sekwencji. - Cerin
@Cerin: Pytanie, o które prosi widoki, nie potrzebujesz uprawnień do sekwencji (przynajmniej nie w momencie pisania, gdzie widoki, które aktualizowalne nie zostały jeszcze zaimplementowane). Aby uzyskać więcej uprawnień, zobacz: stackoverflow.com/questions/24918367/... - Erwin Brandstetter