2009-06-03 15 views
11

Quelle est la méthode recommandée pour déterminer si un utilisateur a un certain droit (par exemple, sélectionner ou exécuter) sur un certaine classe (par exemple table ou fonction) dans PostgreSQL?Détermine si l'utilisateur a l'autorisation de sélectionner/mettre à jour/... une table/fonction/... dans PostgreSQL

Au moment où je suis quelque chose comme

aclcontains(
    someColumnWithAclitemArray, 
    makeaclitem(userOid,grantorOid,someRight,false)) 

mais il est terrible que je dois vérifier pour chaque grantorOid qui est possible et pour chaque userOid l'utilisateur peut appartenir. Sur une note connexe: quels sont les droits possibles que vous pouvez tester? Je ne l'ai pas trouvé de documents, mais la lecture du code source, je suppose:

INSERT 
SELECT 
UPDATE 
DELETE 
TRUNCATE 
REFERENCES 
TRIGGER 
EXECUTE 
USAGE 
CREATE 
CONNECT 

Il semble aussi être un droit CREATE TEMP, mais je ne peux pas comprendre le texte correct à utiliser dans le makeaclitem -fonction.

Répondre

17

J'ai trouvé qu'une meilleure approche (et je semble me rappeler que cela a été pris à partir de certaines requêtes construites dans psql, ou peut-être les vues information_schema) est d'utiliser les fonctions has_*_privilege, et de les appliquer simplement à un ensemble de combinaisons possibles d'utilisateur et d'objet. Cela tiendra compte de l'accès à un objet via un rôle de groupe.

Par exemple, cela montrera que les utilisateurs ont accès à qui tables et vues non-catalogue:

select usename, nspname || '.' || relname as relation, 
     case relkind when 'r' then 'TABLE' when 'v' then 'VIEW' end as relation_type, 
     priv 
from pg_class join pg_namespace on pg_namespace.oid = pg_class.relnamespace, 
    pg_user, 
    (values('SELECT', 1),('INSERT', 2),('UPDATE', 3),('DELETE', 4)) privs(priv, privorder) 
where relkind in ('r', 'v') 
     and has_table_privilege(pg_user.usesysid, pg_class.oid, priv) 
     and not (nspname ~ '^pg_' or nspname = 'information_schema') 
order by 2, 1, 3, privorder; 

Les privilèges possibles sont détaillés dans la description des fonctions has_*_privilege à http://www.postgresql.org/docs/current/static/functions-info.html#FUNCTIONS-INFO-ACCESS-TABLE. 'CREATE TEMP' est un privilège de niveau base de données: il permet à un utilisateur d'utiliser un schéma pg_temp_*.

Il peut être testé avec has_database_privilege(useroid, datoid, 'TEMP').

6

Consultez également la page de référence "GRANT".