Re: roles

From: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
To: suso <jlcubas(at)terra(dot)es>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: roles
Date: 2009-05-18 16:48:41
Message-ID: 20090518164841.GH10339@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

suso escribió:
> Hola Alvaro que tal!, gracias por responder
>>> Hola de nuevo, tengo un par de "dudillas", que son:
>>>
>>> 1 - Es posible crear algún tipo de rol, ya sea de grupo o login,
>>> especial, que solo tenga permisos de lectura de la base de datos
>>
>> Claro. Debes asegurarte de revocar los privilegios a PUBLIC de todos
>> los objetos para que esto tenga efecto. (Normalmente uno hace REVOKE a
>> ese rol, pero el rol sigue teniendo acceso; la explicación es que el
>> privilegio se obtiene porque PUBLIC los tiene). Luego le das GRANT
>> SELECT en las tablas que te interesen. Observa también que debes
>> otorgar privilegios a tablas y esquemas separadamente.
>>
> Es decir, solo hacer un REVOKE a el/os rol/es de login y/ grupos , y en
> función de eso, lo hago para cada tablas o lo que tenga acceso ese/os
> rol/es.

Además debes hacer

REVOKE bla bla FROM PUBLIC;

>
> 1 - Mi intención es crear 2 "grupos", uno con acceso completo a todas
> las tablas de datos, y lo que sea necesario (pero no de superusuario), y
> otro grupo que sólo según el caso, o bien sólo ver unas determinadas
> tablas de datos, o verlas todas pero solo "ver", ningún tipo de
> modificación, por eso el tema de controlar ese acceso y enviar
> "mensajes", cuando alguien que no tiene los permisos adecuados decirle
> "oye, esto no puedes hacerlo", pero quizás, eso se podría hacer con un
> trigger, y un SP, es correcto?
> Pero aún así, me haría falta obtener por código "el tipo de permiso"
> que tiene esa persona, pq según sea, le bloqueo el acceso a ciertas
> partes del programa, no sólo a las tablas, no sé si me explico.

Ya entiendo. Supongo que lo que debes hacer es asignar cada uno de esos
permisos a distintos roles de no-login, y luego otorgarle esos roles a
los otros roles (que son los de login).

Puedes saber si el rol actual "tiene" tal o cual rol usando la función
pg_has_role, y usar eso para activar los distintos módulos en tu
aplicación:

alvherre=# create role lectura_sobre_tablas nologin;
CREATE ROLE
alvherre=# create role pedro;
CREATE ROLE
alvherre=# grant lectura_sobre_tablas to pedro;
GRANT ROLE

--- acá un ejemplo de cómo obtener la info si ya eres ese usuario:
alvherre=# set session authorization pedro;
SET
alvherre=> select pg_has_role('lectura_sobre_tablas', 'usage');
pg_has_role
-------------
t
(1 fila)

-- ejemplo de cómo obtenerlo cuando eres algún otro usuario:
alvherre=> reset session AUTHORIZATION ;
RESET
alvherre=# select pg_has_role('pedro', 'lectura_sobre_tablas', 'usage');
pg_has_role
-------------
t
(1 fila)

--
Alvaro Herrera http://www.amazon.com/gp/registry/DXLWNGRJD34J
"El número de instalaciones de UNIX se ha elevado a 10,
y se espera que este número aumente" (UPM, 1972)

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Emanuel Calvo Franco 2009-05-18 16:56:31 Re: Diferencia entre indices btree, rtree y hash
Previous Message Mariano Reingart 2009-05-18 16:18:51 Re: [pgsql-es-ayuda] funciones de replicación