usuario case insensitive

No sé si alguien ya se chocó con esto… En mi institución se utiliza Active Directory de Microsoft, acá el Usuario jlopez, jLopez y JLOPEZ son el mismo…
De esto se desprenden 2 inconveniente (como mínimo) pero quisiera comentarles, en G3W se soluciona personalizando la clase modelo/datos/db/persona, les resalto en negritas el cambio:

function buscar_clave($parametros)
{
    $sql = "SELECT clave, persona FROM mdp_personas WHERE usuario [b]ilike[/b] {$parametros['usuario']}";
    $datos = kernel::db()->consultar_fila($sql);
    return $datos;
}

function buscar_persona($parametros)
{
    $sql = "SELECT persona FROM mdp_personas WHERE usuario [b]ilike[/b] {$parametros['usuario']}";
    $datos = kernel::db()->consultar_fila($sql);
    return $datos;
}

El tema son las webs que usan Arai… ocurre exactamente el mismo “error” y no quisiera editar los fuentes del Arai.

Hola Diego,

El tema son las webs que usan Arai... ocurre exactamente el mismo "error" y no quisiera editar los fuentes del Arai.

Si usas el SAML de SIU-Araí hace el siguiente llamado al autenticarte en SIU-Guaraní:

  1. Función autenticar de src/siu/modelo/autenticacion/auth_saml.php.

  2. Función autenticar_login_saml de src/siu/modelo/autenticacion/fuente_usuarios_guarani.php.

  3. Si en instalacion/login.php tenes ‘local_uid’ => ‘usuario’ va a ejecutar la función saml_buscar_por_usuario de src/siu/modelo/datos/db/persona.php.

  4. Función buscar_clave de src/siu/modelo/datos/db/persona.php.

En mi institución se utiliza Active Directory de Microsoft, acá el Usuario jlopez, jLopez y JLOPEZ son el mismo...

¿Hay forma de convertirlos en minúscula antes de pasarlos a la query para evitar usar el ilike?

saludos.
2

Pensaría que hay forma, pero no hay garantías de que el usuario guardado en el Active Directory haya sido escrito en minúsculas.

Caso contrario, sin usar ilike podría hacerse:

function buscar_clave($parametros)
{
    $sql = "SELECT clave, persona FROM mdp_personas WHERE lower(usuario) [b]=[/b] lower({$parametros['usuario']})";
    $datos = kernel::db()->consultar_fila($sql);
    return $datos;
}

function buscar_persona($parametros)
{
    $sql = "SELECT persona FROM mdp_personas WHERE upper(usuario) [b]=[/b] upper({$parametros['usuario']})";
    $datos = kernel::db()->consultar_fila($sql);
    return $datos;
}

Pero me parece más legible usar ilike…

Hola Diego,

Es preferible hacer una comparación de minúsculas a minúsculas como el ejemplo que diste primero (o mayúsculas a mayúsculas es lo mismo).

El ILIKE no te lo recomiendo, ya que si el usuario de SAML es ‘Die_o’ o ‘Dieg%’ te va a traer resultados que no son los correctos (el ‘_’ es muy probable que este en un username).

Referencia: https://kb.objectrocket.com/postgresql/how-to-use-ilike-in-postgres-1258

Entiendo que el Active Directory de Microsoft no te permite tener dos usuarios donde uno es “Diego” y el otro “diego”, ya que los considera como el mismo, no?

saludos.
2

exacto, es un ùnico usuario… pero el AD igual que el LDAP no son perfectos :frowning: si se mete mal la mano se puede tener datos casi “duplicados” en distintas ramas (y depende de la rama en la que busques primero es el usuario que encontrás).

Hola Diego, gracias por la información!!!

Creo que la mejor solución seria comparar de minúsculas a minúsculas (usando la función lower de Postgres).

En cuanto a Guaraní, si vas a Administrar Personas solapa Acceso al sistema el campo usuario es “case insensitive”, con lo cual “dturriaga”, “dTurriaga” y “DTURRIAGA” los considera los mismo y da el siguiente error de la captura.

saludos.
2


Selection_039.png

Selection_039.png