Biorąc pod uwagę rolę bazy danych, user1
funkcja something()
zdefiniowana jako procedura składowana i widok utworzony jak:
CREATE VIEW view1 AS select * from something()
I biorąc pod uwagę te uprawnienia:
REVOKE ALL ON FUNCTION something FROM user1
REVOKE SELECT ON view1 FROM user1
Po uruchomieniu SELECT * FROM view1
pojawia się błąd permission denied for function something()
.
Moje pytanie brzmi: jeśli odwołam uprawnienia wyboru w widoku, dlaczego wywoływana jest ta funkcja? Spodziewałem się czegoś takiego:
permission denied for relation view1
Dziękuję Ci!
postgresql
permissions
view
Santios
źródło
źródło
something()
funkcją. Szybki test polegałby na zmodyfikowaniu zapytania, tak aby uzyskać inny plan wyjaśniania, odpowiednio dostosowując uprawnienia, a następnie sprawdzić, czy błąd funkcji został zgłoszony wsomething()
funkcji lub czy wynika ze sposobu ponownej oceny nowego planu wykonania.Odpowiedzi:
Problem w tym przypadku nie dotyczy dokładnie kolejności uprawnień, ale kolejności wykonania.
W CV dla PostgreSQL:
1- Widoki będące tabelami dostępu zastępują uprawnienia do tabel
2- Widoki uzyskujące dostęp do funkcji, będą musiały ocenić wszystkie funkcje, zanim zostaną sprawdzone - więc funkcje muszą zostać wykonane przed uzyskaniem dostępu do widoku, nawet jeśli widok nie ma uprawnień wyboru ...
Jak możemy to udowodnić?
W postgresql widoki są w stanie dać ci uprawnienia do dokonywania wyboru w tabeli, nawet jeśli użytkownik nie ma takich uprawnień.
Na przykład:
Zaloguj się jako użytkownik 1:
W takim przypadku użytkownik będzie mógł wybrać widok 2, nawet nie mając uprawnień do wyboru tabeli.
Ale co jeśli zrobimy to samo z funkcją ? Zachowanie NIE jest takie samo. Stwórzmy funkcję, która czeka 5 sekund przed zwróceniem 1 (abyśmy mogli debugować, jeśli postgresql uruchamia funkcję za każdym razem, gdy wywołujemy widok)
Zaloguj się jako użytkownik 1:
Zezwolenie na dokonanie wyboru w widoku nie zastępuje uprawnienia funkcji, a nawet najgorsze, jeśli cofniemy uprawnienia z widoku 1, komunikat nadal pokazuje, że postgresql zatrzymał nasze zapytanie z powodu funkcji, bez względu na pozwolenie na widok. (dokładnie to dzieje się w pytaniu)
Ale czy funkcja naprawdę jest najpierw sprawdzana? Jeśli damy tej funkcji uprawnienia „wszystkie”, ale cofniemy uprawnienie do wyświetlania ...
Jak widzisz postgresql ODCZYTAŁ 5 SEKUND, zanim powiedział, że nie mamy pozwolenia na wyświetlenie widoku , pokazując, że funkcja „coś ()” jest wykonywana. Zatem powrót danych funkcji musi istnieć przed sprawdzeniem widoku.
Teraz dzięki tym testom wiemy, że PostgreSQL musiał najpierw ocenić wszystkie funkcje przed kontynuowaniem zapytania, jest tak, jakby zapytanie wciąż nie istniało, dopóki wszystkie włączone funkcje nie zostaną w pełni zakończone, więc widok nie może zostać rozwiązany dla postgresql, aby wiemy, czy mamy pozwolenie na jego wybór.
Myślę, że to odpowiedź na twoje pytanie w kategoriach „kolejności zezwoleń”, ale dlaczego postgresql musi ocenić wszystkie funkcje przed kontynuowaniem, to kolejne pytanie ...
źródło