Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » PostgreSQL »

como hacer select de la tabla pg_user

Estas en el tema de como hacer select de la tabla pg_user en el foro de PostgreSQL en Foros del Web. Hola a todos, quiero hacer una select en la tabla pg_user para autentificar a un usuario desde php. Una select de este tipo pg_query("select usename ...
  #1 (permalink)  
Antiguo 21/03/2011, 06:46
 
Fecha de Ingreso: enero-2011
Mensajes: 88
Antigüedad: 13 años, 3 meses
Puntos: 1
como hacer select de la tabla pg_user

Hola a todos,

quiero hacer una select en la tabla pg_user para autentificar a un usuario desde php.
Una select de este tipo

pg_query("select usename from pg_user where usename='usuario1' and passwd='mipasword'");
Pero esto no funciona he visto que al campo passwd se le aplica md5 pero a mi no me funciona, la select siempre me debuelbe vacio.

Alguien sabe como se hace este tipo de consultas especiales?

Gracias, atentemte Eñaut.
  #2 (permalink)  
Antiguo 22/03/2011, 07:34
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: como hacer select de la tabla pg_user

Te explico lo que entendí en este momento.

Cuando creas un usuario, esta información se almacena realmente en la tabla pg_authid. pg_user es solo una vista a esta tabla. Y postgresql por dentro solo pone unos asteriscos a este campo. Por lo que la vista pg_user no te servirá para autenticar usuarios.

Acabo de leer en la documentación de postgresql (cerré la ventana y ahora no la encuentro ) que la forma como almacena los password al crear usuarios es 'contraseñausuario' en md5. Por ejemplo: para el usuario user_daniel con contraseña password_daniel, el almacenamiento se hace md5('userdanielpassworddaniel').

Sabiendo esto... hice una prueba creando un usuario:

Código SQL:
Ver original
  1. CREATE USER danielito WITH PASSWORD 'danielito';

reviso la tabla pg_authid
Código SQL:
Ver original
  1. postgres=> SELECT rolname,rolpassword FROM pg_authid;
  2.    rolname   |             rolpassword
  3. -------------+-------------------------------------
  4.  postgres    | md5f8190ea2a42cea0c1ebde86b5291b2fe
  5.  creft_admin | md550e1c958f80fa60ccf9dd6b975d7f85c
  6.  danielito   | md5e4b43e3f991f4d922f78a0fbb3d74052
  7. (3 filas)

Fijate que el campo password todos empiezan por md5.

hago esta prueba
Código SQL:
Ver original
  1. postgres=> SELECT MD5('danielito');
  2.                md5
  3. ----------------------------------
  4.  f3e399a7288dc9c4dd6ab228d0e30c77
  5. (1 fila)

Nada que ver con el password.

Según el apartado donde mencionan la forma que postgresql almacena las contraseñas hago está prueba:
Código SQL:
Ver original
  1. postgres=> SELECT MD5('danielitodanielito');
  2.                md5
  3. ----------------------------------
  4.  e4b43e3f991f4d922f78a0fbb3d74052
  5. (1 fila)

Está si me da el password real.

Solo le hace falta la palabra md5 al principio.

Hacemos está consulta:
Código SQL:
Ver original
  1. postgres=> SELECT rolname,rolpassword
  2. FROM pg_authid WHERE rolpassword = 'md5' || MD5('danielitodanielito');
  3.   rolname  |             rolpassword
  4. -----------+-------------------------------------
  5.  danielito | md5e4b43e3f991f4d922f78a0fbb3d74052
  6. (1 fila)

Y funciona.

En pocas palabras y después de tanta chachara..

Para solucionar tu problema, la cosa sería:

Código PHP:
Ver original
  1. pg_query("SELECT rolname FROM pg_authid WHERE rolname='usuario1' AND rolpassword = 'md5' || md5('mipaswordusuario1')");

esto es según el ejemplo que pones.

Gracias a tu pregunta aprendí algo nuevo hoy.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 22/03/2011, 07:34
 
Fecha de Ingreso: marzo-2011
Ubicación: Bogotá
Mensajes: 4
Antigüedad: 13 años, 1 mes
Puntos: 0
Respuesta: como hacer select de la tabla pg_user

En realidad la vista pg_user no contierne la informacion de la contrasena del rol..si vemos la definicion de la misma:

CREATE OR REPLACE VIEW pg_user AS
SELECT pg_shadow.usename, pg_shadow.usesysid, pg_shadow.usecreatedb, pg_shadow.usesuper, pg_shadow.usecatupd, '********'::text AS passwd, pg_shadow.valuntil, pg_shadow.useconfig
FROM pg_shadow;

Esta contiene un a lista de asteriscos para la contraseña, incluso pg_shadow tampoco contiene la contraseña, la información para autenticación esta en la tabla pg_authid donde se encuentran tanto los grupos como los roles, el usuario y la contraseña se encuentran en sus campos rolname y rolpassword respectivamente. La estructura del atributo rolpassword es la siguiente: 'md5' || md5(contrasena || usuario), para su caso, la sentencia de autenticación seria:

select rolname from pg_authid where rolname='usuario1' and rolpassword='md5' || md5('mipasword' || 'usuario1');
  #4 (permalink)  
Antiguo 23/03/2011, 02:47
 
Fecha de Ingreso: enero-2011
Mensajes: 88
Antigüedad: 13 años, 3 meses
Puntos: 1
Respuesta: como hacer select de la tabla pg_user

Muchisimas gracias por la respuesta voy a probarlo cuando pueda.

Hasta pronto.
  #5 (permalink)  
Antiguo 23/03/2011, 08:36
 
Fecha de Ingreso: enero-2011
Mensajes: 88
Antigüedad: 13 años, 3 meses
Puntos: 1
Respuesta: como hacer select de la tabla pg_user

Pues funciona!!!

Gracias por la ayuda.

Etiquetas: select, tablas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:00.