Trennung "interner"/"externer" User, Verwendung eines Facade-Schemas

Hallo in die Runde,
ich möchte gern den Zugriff auf diverse Tabellen und eigene PG-Funktionen nach aussen abschotten.

Dazu habe ich eine function fct_generic geschrieben, liegt im Schema public (=“facade”). Im zweiten Schema “application” liegen diverse functions “fct_123”, “fct_124”, “fct_125” etc. sowie alle Daten (tables). Sämtliche appplication.functions werden über public.fct_generic genutzt nach dem muster: fct_generic(“123”, “load_data”). Der Aufruf innerhalb fct_generic sieht dann so aus: fct_123(“load_data”).

Funktioniert soweit wunderbar. Nur offenbar muss der user “app_user”, welcher für Schema “public” berechtigt ist und von aussen “SELECT fct_generic(…)” aufruft, auch für sämtliche sonstigen tables und functions berechtigt sein, die von fct_generic direkt oder indirekt (zB über fct_123) angesprochen werden. Das wiederum gefällt mir nicht. “app_user” soll den Inhalt von Schema “application” nicht sehen/auflisten können.

Vermutlich wurden solche Szenarion schon irgendwo realisiert. Gibt es dazu Best Practices? Beim Googlen hatte ich den Hinweis gefunden, dass dieses Szenario mit zwei Datenbanken (anstelle zwei Schema) realisiert werden könnte? Muss ich in meiner fct_generic einen User mit Password angeben? Dies könnte der fct_generic-User dann allerdings auslesen? Wo ist mein entscheidender Denkfehler?

Danke für sachdienliche Hinweise! :slight_smile:
Rainer

wie so oft: manchmal ist die lösung ganz einfach, wenn man nur erstmal die richige spur hat. SECURITY DEFINER ist das Stichwort, angewendet auf “fct_generic”. Falls jemand mal die gleiche Frage hat :slight_smile:

ok, dazu noch notwendig:
REVOKE ALL ON TABLE pg_proc FROM app_user;
REVOKE SELECT ON TABLE pg_proc FROM public;