Esegui questo connesso al database che vuoi configurare.
-- Create the user.
CREATE ROLE somebody WITH LOGIN PASSWORD '...';
-- Prevent all authenticated users from being able to use the database,
-- unless they have been explicitly granted permission.
REVOKE ALL PRIVILEGES ON DATABASE foo FROM PUBLIC;
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM PUBLIC;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM PUBLIC;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM PUBLIC;
-- Allow the user to only use the specified functions.
GRANT CONNECT ON DATABASE foo TO somebody;
GRANT EXECUTE ON FUNCTION return_customers(), return_time() TO somebody;
Se hai più schemi di "pubblici", dovrai aggiungerli ai due REVOKE ALL PRIVILEGES ON ALL ...
dichiarazioni.
Non dimenticare che le funzioni devono essere state create con SECURITY DEFINER
o questo utente non sarà ancora in grado di eseguirli, poiché i contenuti della funzione verranno eseguiti con le autorizzazioni di questo utente, anziché dell'utente che ha creato la funzione.
Vedi:
CREATE FUNCTION
in particolareSECURITY DEFINER
GRANT
sia per aggiungere utenti ai ruoli che per assegnare diritti di accesso a tabelle, sequenze, eccREVOKE
CREATE ROLE