Obtener los roles de un usuario

Lists: pgsql-es-ayuda
From: Rubén da Silva <ruben(at)ozonomultimedia(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Obtener los roles de un usuario
Date: 2006-05-03 18:42:22
Message-ID: 4458F98E.1040406@ozonomultimedia.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Lo sé, I know, esto ya lo he probado! :

-Se puede hacer comparando la lista de usuarios de cada rol con el oid
de mi usuario. (Obteniendo el array y haciendolo fuera de la BD) o
mediante un procedimiento almacenado.
-Se puede preguntar mediante pg_has_role() si un rol pertenece a otro
rol (grupo), pero implicaría varias consultas (tantas como grupos).
-Se que como administrador o con los permisos suficientes podría
obtenerse tambien de la tabla pg_authid.

Pero me gustaría obtener, dado el nombre de usuario (rol de login) y
estando conectado a la BD como éste (es decir, conectado como ese mismo
usuario sin permisos "admin") y a través de 1 sola consulta, la lista de
roles a los que pertenece tal usuario.

Hasta ahora he hecho:

"
SELECT groname, grosysid
FROM pg_group
WHERE grolist *= (SELECT usesysid FROM pg_user WHERE usename = 'xxxx')
"

Pero parece que el tipo de dato de grolist (oid[]) no funciona como un
array o ese operador que me he encontrado googleando no vale.

P.D. He mirado en codigo fuente del PGadmin3 y lo hacen obteniendo el
array y comparando cada OID de éste con la OID del usuario, por fuera,
en la propia aplicación.

¿No se podría hacer de una forma más sencilla?
Einstein creyó que "tiene que ser más sencillo que todo esto".

Un saludo
Rubén


From: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
To: Rubén da Silva <ruben(at)ozonomultimedia(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Obtener los roles de un usuario
Date: 2006-05-03 19:52:34
Message-ID: 20060503195234.GO18026@surnet.cl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Rubén da Silva escribió:

> Hasta ahora he hecho:
>
> "
> SELECT groname, grosysid
> FROM pg_group
> WHERE grolist *= (SELECT usesysid FROM pg_user WHERE usename = 'xxxx')
> "

Hum, esto es en 8.1 o una version anterior? En 8.1 deberias estar
examinando los catalogs pg_authid y pg_auth_members, no pg_group y
pg_user. Estas dos ultimas estan obsoletas.

--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.


From: Rubén da Silva <ruben(at)ozonomultimedia(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Obtener los roles de un usuario
Date: 2006-05-04 10:59:31
Message-ID: 4459DE93.9020801@ozonomultimedia.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Alvaro Herrera wrote:
> Rubén da Silva escribió:
>
>
>>Hasta ahora he hecho:
>>
>>"
>>SELECT groname, grosysid
>>FROM pg_group
>>WHERE grolist *= (SELECT usesysid FROM pg_user WHERE usename = 'xxxx')
>>"
>
>
> Hum, esto es en 8.1 o una version anterior? En 8.1 deberias estar
> examinando los catalogs pg_authid y pg_auth_members, no pg_group y
> pg_user. Estas dos ultimas estan obsoletas.
>

No todos los usuarios pueden hacer SELECT de esa tablas pg_authid y
pg_auth_members.

Sin embargo pg_group y pg_user son vistas accesibles publicamente.


From: Rubén da Silva <ruben(at)ozonomultimedia(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Obtener los roles de un usuario
Date: 2006-05-04 11:30:19
Message-ID: 4459E5CB.4050507@ozonomultimedia.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Rubén da Silva wrote:
> Lo sé, I know, esto ya lo he probado! :
>
> -Se puede hacer comparando la lista de usuarios de cada rol con el oid
> de mi usuario. (Obteniendo el array y haciendolo fuera de la BD) o
> mediante un procedimiento almacenado.
> -Se puede preguntar mediante pg_has_role() si un rol pertenece a otro
> rol (grupo), pero implicaría varias consultas (tantas como grupos).
> -Se que como administrador o con los permisos suficientes podría
> obtenerse tambien de la tabla pg_authid.
>
> Pero me gustaría obtener, dado el nombre de usuario (rol de login) y
> estando conectado a la BD como éste (es decir, conectado como ese mismo
> usuario sin permisos "admin") y a través de 1 sola consulta, la lista de
> roles a los que pertenece tal usuario.
>
> Hasta ahora he hecho:
>
> "
> SELECT groname, grosysid
> FROM pg_group
> WHERE grolist *= (SELECT usesysid FROM pg_user WHERE usename = 'xxxx')
> "

Esto es increíble... me contesto a mi mismo:

SELECT groname, grosysid
FROM pg_group
WHERE
(SELECT usesysid FROM pg_user WHERE usename = 'xxxx') ANY (grolist)

>
> Pero parece que el tipo de dato de grolist (oid[]) no funciona como un
> array o ese operador que me he encontrado googleando no vale.
>
> P.D. He mirado en codigo fuente del PGadmin3 y lo hacen obteniendo el
> array y comparando cada OID de éste con la OID del usuario, por fuera,
> en la propia aplicación.
>
> ¿No se podría hacer de una forma más sencilla?
> Einstein creyó que "tiene que ser más sencillo que todo esto".
>
> Un saludo
> Rubén