Ver Mensaje Individual
  #2 (permalink)  
Antiguo 22/03/2011, 07:34
Avatar de huesos52
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