Skip site navigation (1) Skip section navigation (2)

Délégation de droits par une procédure stockée - CREATE ROLE en plpgsql.

From: Alain Benard <alain(dot)benard(at)nancy(dot)inra(dot)fr>
To: pgsql-fr-generale(at)postgresql(dot)org
Subject: Délégation de droits par une procédure stockée - CREATE ROLE en plpgsql.
Date: 2012-02-09 09:39:15
Message-ID: 4F339443.9040506@nancy.inra.fr (view raw or flat)
Thread:
Lists: pgsql-fr-generale
Bonjour,
hébergeant une base de donnée de collègues à qui je ne souhaite pas 
confier trop de privilèges sans toutefois vouloir gérer complétement 
leur population d'utilisateurs voici mes tentatives :
Dans les 2 scénarios ci-après je créé leur base avec 3 groupes (1 pour 
l'administration de la structure, 1 pour la modification des données, 1 
pour la consultation)

 1. premier scénario : je créé un ou plusieurs compte avec l'option
    CREATEROLE dans la commande CREATE ROLE. Ce ou ces comptes peuvent
    bien créer d'autres rôles et les inscrire dans les groupes ou rôles
    adéquats mais disposent cependant de trop de droits (suppression ou
    modification de n'importe quel rôle - inscription de rôles dans des
    groupes donnant accès à d'autres bases de données ...). La solution
    n'est donc pas dans ce scénario (sauf si j'ai loupé quelque chose ???).
 2. second scénario : j'essaie de créer une procédure stockée qui
    s'exécute avec les droits du definer (un admin par exemple) et qui
    crée le compte utilisateur en l'ajoutant dans un groupe fixé à
    l'avance. Par exemple une fonction ajout_lecteur(nomlecteur) qui
    crée le rôle nomlecteur et l'inscrit dans le groupe habilité à
    consulter la base en question. En dehors du contexte d'exécution de
    la procédure stockée le compte n'existe pas, c'est à dire qu'il n'y
    a pas persistance de la création du compte : pour affirmer ça j'ai
    tenté de supprimer le compte après sa création dans la proc stockée
    (2 lignes commentées avec DROP ROLE) et même de le créer une seconde
    fois avec un message d'erreur obtenu précisant qu'il existe déjà.
    Est-ce que des mécanismes internes interdisent à postgres de faire
    ça auquel cas il faudrait que les possibilités d'administration
    soient revues, ou bien je fais une erreur de mon analyse??
    Ci-dessous le code plpgsql.

CREATE OR REPLACE FUNCTION public.creer_lecteur ( compte text)
RETURNS pg_catalog.void AS
$body$
DECLARE

--declaration des variables de traitements

req varchar(4000);

BEGIN
         req := 'CREATE ROLE ' || compte || ' LOGIN PASSWORD 
''password'' IN ROLE bdd_lecture;';
         EXECUTE req;

         -- req := 'DROP ROLE ' || compte || ';';
         -- EXECUTE req;

         RAISE NOTICE 'Creation du compte';

EXCEPTION
WHEN OTHERS THEN
         raise notice '% %', sqlstate, sqlerrm;

RETURN;
END;

$body$
LANGUAGE 'plpgsql'
IMMUTABLE
CALLED ON NULL INPUT
SECURITY DEFINER
COST 100;

Merci par avance.
Alain Benard


Attachment: alain_benard.vcf
Description: text/x-vcard (286 bytes)

Responses

pgsql-fr-generale by date

Next:From: Alain BenardDate: 2012-02-09 10:24:48
Subject: Re: Délégation de droits par une procédure stockée - CREATE ROLE en plpgsql. - Problème réglé
Previous:From: damien clochardDate: 2012-02-07 13:03:24
Subject: RMLL 2012 : Appel à Conférences

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group