Pour en savoir si l'utilisateur a l'autorisation de sélectionner / mise à jour / ... une table / fonction / ... dans PostgreSQL

StackOverflow https://stackoverflow.com/questions/946804

Question

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 une certaine classe (par exemple table ou 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 y avoir un droit de CREATE TEMP, mais je ne peux pas comprendre le texte correct à utiliser dans la makeaclitem fonction.

Était-ce utile?

La solution

Je l'ai trouvé qu'une meilleure approche (et je crois me rappeler cela a été pris de certaines requêtes intégrées dans psql, ou peut-être les vues information_schema) est d'utiliser les fonctions de has_*_privilege, et les appliquer simplement à un ensemble de tous les possibles combinaisons d'utilisateurs et de l'objet. Cela tient compte d'avoir accès à un objet via un rôle de groupe ainsi.

Par exemple, cela montrera que les utilisateurs ont qui accès aux 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 de has_*_privilege http://www.postgresql.org/docs/current/static/functions-info.html#FUNCTIONS-INFO-ACCESS-TABLE .

« CREATE TEMP » est un privilège au niveau de la 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').

Autres conseils

Jetez un oeil à la » des privilèges d'accès Fonctions d'interrogation « et aussi » SUBVENTION " page de référence.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top