2009-06-03 15 views
11

¿Cuál es la forma recomendada de averiguar si un usuario obtuvo un cierto derecho (por ejemplo, seleccionar o ejecutar) en un cierta clase (por ejemplo, tabla o función) en PostgreSQL?Averiguar si el usuario obtuvo permiso para seleccionar/actualizar/... una tabla/función/... en PostgreSQL

En el momento en que tiene algo así como

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

pero es horrible ya que tengo que comprobar para cada grantorOid que es posible y para cada userOid el usuario puede pertenecer.

En una nota relacionada: ¿cuáles son los posibles derechos que puede probar? no he encontrado ninguna documentación, pero la lectura del código fuente supongo:

INSERT 
SELECT 
UPDATE 
DELETE 
TRUNCATE 
REFERENCES 
TRIGGER 
EXECUTE 
USAGE 
CREATE 
CONNECT 

También parece ser un derecho CREATE TEMP, pero no puedo averiguar el texto correcto a utilizar en el makeaclitem -función.

Respuesta

17

He encontrado que un mejor enfoque (y creo recordar que esto fue tomado de algunas consultas integradas en psql, o tal vez en las vistas de información_schema) es usar las funciones has_*_privilege, y simplemente aplicarlas a un conjunto de todas posibles combinaciones de usuario y objeto. Esto tendrá en cuenta el acceso a un objeto a través de un rol de grupo también.

Por ejemplo, lo que permitirá reconocer el cual los usuarios tienen acceso a las tablas no y vistas del catálogo:

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; 

Los posibles privilegios se detallan en la descripción de las funciones has_*_privilege en http://www.postgresql.org/docs/current/static/functions-info.html#FUNCTIONS-INFO-ACCESS-TABLE.

'CREATE TEMP' es un privilegio de nivel de base de datos: permite a un usuario utilizar un esquema pg_temp_*. Se puede probar con has_database_privilege(useroid, datoid, 'TEMP').

Cuestiones relacionadas