PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 09/09/2017 13:27:29

superette
Membre

Problème de droits sur vue crée sur des tables distantes

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

#2 09/09/2017 13:36:48

superette
Membre

Re : Problème de droits sur vue crée sur des tables distantes

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

#3 10/09/2017 16:02:32

gleu
Administrateur

Re : Problème de droits sur vue crée sur des tables distantes

Ç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

#4 10/09/2017 16:56:18

superette
Membre

Re : Problème de droits sur vue crée sur des tables distantes

merci pour cette réponse.

Hors ligne

Pied de page des forums