Eu criei um banco de dados, função e esquema com este script:
-- -----------------------------------------------------------------------------
-- set variables ---------------------------------------------------------------
-- -----------------------------------------------------------------------------
\set dbname keycloak
\set schemaname :dbname
\set rolename :dbname
-- -----------------------------------------------------------------------------
-- create ROLE and Database ----------------------------------------------------
-- -----------------------------------------------------------------------------
CREATE ROLE :rolename WITH LOGIN ;
CREATE DATABASE :dbname WITH OWNER :rolename ;
-- -----------------------------------------------------------------------------
-- connect to DB, create SCHEMA & set privileges -------------------------------
-- -----------------------------------------------------------------------------
\c :dbname
REVOKE ALL ON SCHEMA public FROM PUBLIC ;
CREATE SCHEMA :schemaname AUTHORIZATION :rolename ;
ALTER ROLE :rolename SET search_path=:schemaname ;
GRANT ALL ON ALL TABLES IN SCHEMA :schemaname TO :rolename ;
REVOKE ALL ON DATABASE :dbname FROM PUBLIC ;
Tudo isso parece funcionar em relação ao que o keycloak
ROLE pode fazer no keycloak
banco de dados.
Agora eu quero GRANT SELECT para um ROLE keycloak_reader
ON ALL TABLES dentro desse keycloak SCHEMA. Além disso, essa função deve ser concedida a outras funções (que devem herdar essas habilidades SELECT [idealmente incluindo o search_path]).
tentei
GRANT CONNECT ON DATABASE keycloak TO keycloak_reader ;
\c keycloak
GRANT SELECT ON ALL TABLES IN SCHEMA keycloak TO keycloak_reader ;
ALTER ROLE keycloak SET search_path=keyckloak ;
Consigo conectar, mas não consigo SELECIONAR nada (permissão negada). Nem como keycloak_reader
, nem como qualquer um dos papéis que os membros do keycloak_reader
grupo.
O que estou fazendo de errado?
Além das permissões no nível de um objeto no banco de dados (tabela, sequência, função etc.), o usuário deve ter
USAGE
privilégio nesse esquema para realmente usar qualquer objeto dentro do esquema.Então você precisa adicionar:
É muito fácil perder, a mensagem de erro só dirá que você não tem permissões no esquema se especificar o nome da tabela junto com o esquema (sem depender de search_path).
As definições de configuração de uma função não podem ser herdadas. Isso é mencionado na documentação aqui :