Vous n'êtes pas identifié(e).
Bonjour,
Je crée une vue sur des tables distantes, mon utilisateur est habilité à lire les données des tables, mais n'accède pas à la vue si le propriétaire de la vue (postgres) n'a pas été mappé. Est ce normal ?
D'avance, merci pour vos retours.
Hors ligne
Pour reproduire le problème :
postgres@bobbynette:~/workdir$ cat 5435_toto_personne.sql
DROP TABLE IF EXISTS personne;
DROP DATABASE IF EXISTS toto;
DROP ROLE IF EXISTS toto_ro;
DROP ROLE IF EXISTS analysts;
DROP ROLE IF EXISTS dba;
DROP USER IF EXISTS tintin;
DROP USER IF EXISTS capitainehaddock;
DROP USER IF EXISTS milou;
CREATE ROLE analysts;
ALTER ROLE analysts WITH INHERIT;
CREATE ROLE dba;
ALTER ROLE dba WITH INHERIT;
CREATE ROLE toto_ro;
ALTER ROLE toto_ro WITH INHERIT;
CREATE USER tintin;
ALTER USER tintin WITH LOGIN INHERIT PASSWORD 'tintin' ;
ALTER GROUP analysts ADD USER tintin;
CREATE USER capitainehaddock;
ALTER USER capitainehaddock WITH LOGIN INHERIT PASSWORD 'capitainehaddock';
ALTER GROUP dba ADD USER capitainehaddock;
CREATE USER milou WITH LOGIN PASSWORD 'milou' ;
CREATE DATABASE toto;
ALTER DATABASE toto OWNER TO dba;
\c toto
CREATE TABLE personne (id_personne uuid, nom varchar, surnom varchar);
ALTER TABLE personne OWNER TO dba;
GRANT SELECT ON personne TO toto_ro;
GRANT toto_ro TO analysts;
postgres@bobbynette:~/workdir$ cat 5434_pouet_ticket.sql
DROP TABLE IF EXISTS ticket;
DROP DATABASE IF EXISTS pouet;
DROP ROLE IF EXISTS pouet_ro;
DROP ROLE IF EXISTS analysts;
DROP ROLE IF EXISTS dba;
DROP USER IF EXISTS tintin;
DROP USER IF EXISTS capitainehaddock;
DROP USER IF EXISTS milou;
CREATE ROLE analysts;
ALTER ROLE analysts WITH INHERIT;
CREATE ROLE dba;
ALTER ROLE dba WITH INHERIT;
CREATE ROLE pouet_ro;
ALTER ROLE pouet_ro WITH INHERIT;
CREATE USER tintin;
ALTER USER tintin WITH LOGIN INHERIT PASSWORD 'tintin' ;
ALTER GROUP analysts ADD USER tintin;
CREATE USER capitainehaddock;
ALTER USER capitainehaddock WITH LOGIN INHERIT PASSWORD 'capitainehaddock';
ALTER GROUP dba ADD USER capitainehaddock;
CREATE USER milou WITH LOGIN;
CREATE DATABASE pouet;
ALTER DATABASE pouet OWNER TO dba;
\c pouet
CREATE TABLE ticket (id_ticket uuid, id_personne uuid, objet varchar);
ALTER TABLE ticket OWNER TO dba;
GRANT SELECT ON ticket TO pouet_ro;
GRANT pouet_ro TO analysts;
postgres@bobbynette:~/workdir$ cat 5432_query_fdw.sql
-- # ========== 9.6 query/ticket_personne 5432
DROP FOREIGN TABLE IF EXISTS personne_site;
DROP FOREIGN TABLE IF EXISTS ticket_site;
DROP USER MAPPING IF EXISTS FOR tintin SERVER toto;
DROP USER MAPPING IF EXISTS FOR tintin SERVER pouet;
DROP USER MAPPING IF EXISTS FOR postgres SERVER toto;
DROP USER MAPPING IF EXISTS FOR postgres SERVER pouet;
DROP SERVER IF EXISTS pouet;
DROP SERVER IF EXISTS toto;
DROP DATABASE IF EXISTS query;
DROP ROLE IF EXISTS query_ro;
DROP ROLE IF EXISTS analysts;
DROP ROLE IF EXISTS dba;
DROP USER IF EXISTS tintin;
DROP USER IF EXISTS capitainehaddock;
DROP USER IF EXISTS milou;
CREATE ROLE analysts;
ALTER ROLE analysts WITH INHERIT;
CREATE ROLE dba;
ALTER ROLE dba WITH INHERIT;
CREATE USER tintin;
ALTER USER tintin WITH LOGIN INHERIT PASSWORD 'tintin' ;
ALTER GROUP analysts ADD USER tintin;
CREATE USER capitainehaddock;
ALTER USER capitainehaddock WITH LOGIN INHERIT PASSWORD 'capitainehaddock';
ALTER GROUP dba ADD USER capitainehaddock;
CREATE USER milou WITH LOGIN PASSWORD 'milou' ;
CREATE ROLE query_ro;
ALTER ROLE query_ro WITH INHERIT;
GRANT query_ro TO analysts;
CREATE DATABASE query;
ALTER DATABASE query OWNER TO dba;
\c query
-- # ====== FDW sur 9.6 query/ticket_personne 5432
CREATE SERVER pouet
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (service 'pouet');
CREATE FOREIGN TABLE ticket_site (id_ticket uuid, id_personne uuid, objet varchar)
SERVER pouet OPTIONS (schema_name 'public', table_name 'ticket');
GRANT SELECT ON ticket_site TO query_ro;
CREATE SERVER toto
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (service 'toto');
CREATE FOREIGN TABLE personne_site (id_personne uuid, nom varchar, surnom varchar)
SERVER toto OPTIONS (schema_name 'public', table_name 'personne');
GRANT SELECT ON personne_site TO query_ro;
CREATE user MAPPING FOR tintin SERVER toto OPTIONS ( USER 'tintin' , PASSWORD 'tintin');
CREATE user MAPPING FOR tintin SERVER pouet OPTIONS ( USER 'tintin' , PASSWORD 'tintin');
GRANT SELECT ON personne_site to query_ro ;
--query=# GRANT USAGE ON FOREIGN SERVER toto TO analysts ;
CREATE VIEW sites AS
SELECT pers.surnom as surnom, tic.id_ticket as ticket, tic.objet as objet
FROM ticket_site tic
JOIN personne_site pers ON pers.id_personne = tic.id_personne;
GRANT SELECT ON sites to query_ro;
-- CREATE USER MAPPING FOR postgres SERVER pouet OPTIONS ( user 'postgres', password 'pgsql');
-- CREATE USER MAPPING FOR postgres SERVER toto OPTIONS ( user 'postgres', password 'pgsql');
\c query tintin
SELECT 1 from sites;
Hors ligne
Ça me paraît normal. Le code d'une vue est exécutée avec les droits de l'utilisateur qui a créé la vue, pas avec ceux de l'utilisateur qui a utilisé la vue. Donc le mapping doit avoir lieu sur l'utilisateur qui a créé la vue.
Guillaume.
Hors ligne
merci pour cette réponse.
Hors ligne