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)
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 |