GRANT
s na różnych obiektach są oddzielne. GRANT
w bazie danych nie ma GRANT
uprawnień do schematu w niej zawartego. Podobnie, GRANT
umieszczanie w schemacie nie daje praw do tabel w nim zawartych.
Jeśli masz uprawnienia do SELECT
z tabeli, ale nie masz prawa do wyświetlania jej w schemacie, który ją zawiera, nie możesz uzyskać dostępu do tabeli.
Testy uprawnień są wykonywane w kolejności:
Do you have `USAGE` on the schema?
No: Reject access.
Yes: Do you also have the appropriate rights on the table?
No: Reject access.
Yes: Check column privileges.
Twoje zamieszanie może wynikać z faktu, że public
schemat ma domyślnie GRANT
wszystkie uprawnienia do roli public
, której członkiem jest każdy użytkownik / grupa. Więc każdy ma już zastosowanie w tym schemacie.
Fraza:
(zakładając, że spełnione są również własne wymagania dotyczące uprawnień obiektu)
Mówi, że musisz mieć USAGE
na schemacie, aby używać obiektów w nim zawartych, ale posiadanie USAGE
na schemacie nie jest samo w sobie wystarczające do używania obiektów w schemacie, musisz również mieć uprawnienia do samych obiektów.
To jest jak drzewo katalogów. Jeśli utworzysz katalog somedir
zawierający plik somefile
, a następnie ustawisz go tak, aby tylko twój własny użytkownik mógł uzyskać dostęp do katalogu lub pliku (tryb rwx------
w katalogu, tryb rw-------
na pliku), nikt inny nie może wyświetlić katalogu, aby zobaczyć, czy plik istnieje.
Gdybyś miał nadać prawa do odczytu pliku na całym świecie (tryb rw-r--r--
), ale nie zmieniałby uprawnień do katalogu, nie miałoby to żadnego znaczenia. Nikt nie mógł zobaczyć pliku, aby go przeczytać, ponieważ nie ma uprawnień do wyświetlenia katalogu.
Jeśli zamiast tego ustawisz rwx-r-xr-x
katalog, ustawiając go tak, aby ludzie mogli wyświetlać i przechodzić przez katalog, ale nie zmieniając uprawnień do pliku, ludzie mogliby wyświetlić plik, ale nie mogliby go odczytać , ponieważ nie mieliby dostępu do pliku.
Musisz ustawić oba uprawnienia, aby ludzie mogli faktycznie wyświetlać plik.
To samo na str. Potrzebujesz zarówno USAGE
praw do schematu, jak i praw do obiektu, aby wykonać akcję na obiekcie, na przykład SELECT
z tabeli.
(Analogia nieco spada, ponieważ PostgreSQL nie ma jeszcze zabezpieczeń na poziomie wiersza, więc użytkownik może nadal "zobaczyć", że tabela istnieje w schemacie, bezpośrednio SELECT
z niej pg_class
. Nie mogą z nią w żaden sposób współdziałać , więc to tylko część „listy” nie jest taka sama).
CREATE EXTENSION
. To mniej więcej ten sam problem z plikami utworzonymi w systemie Linux, gdy tysu
. Będzie dobrze, jeślisudo -e
w pqsl jest coś w rodzaju instrukcji for.GRANT
instrukcje nie specyficzne dla tabel nie są tym, czego chcę, ponieważ wpływają na wszystkie bazy danych ...: sGRANT
na schemacie wpływa na ten schemat.GRANT ... ON ALL TABLES IN SCHEMA ...
wpływa na wszystkie tabele w schemacie w określonej bazie danych. Nie ma żadnych,GRANT
które wpływają na wszystkie bazy danych (ok, z wyjątkiemGRANT
przypisania roli użytkownika).psql
bez-d db
działania „poza” jakąkolwiek bazą danych, ale zawsze jesteś połączony z bazą danych i domyślnie łączysz się z bazą danych o tej samej nazwie, co Twoja rola. db = role = user = group ... to trochę zagmatwane: DWITH LOGIN
; zasadniczo wszystko może być grupą i można ustawić grupy tak, aby mogły się logować.W przypadku systemu produkcyjnego możesz użyć tej konfiguracji:
źródło
admin
być również przyznawaneCREATE
w schemacie?GRANT USAGE ON SCHEMA
, administrator nie może utworzyć tabeli, ale może to zrobić za pomocąALL GRANT ALL ON SCHEMA
…grant all on schema public to admin
? PS: Dodałem teżgrant usage, select on all sequences in schema public to read_only/read_write;
grant execute on all functions in schema public to read_only/read_write;
Cóż, to moje ostateczne rozwiązanie dla prostej bazy danych dla systemu Linux:
źródło