Login único y administración de permisos jerárquica

Hola, Gabriel: Espero no llegar a destiempo con la respuesta. Te comento que en la Facultad de Cs. Económicas de la UNER estamos utilizando toba con la autenticación ldap, pero con la gestión de usuarios de toba, para poder aprovechar sus funcionalidades como permisos para sistemas, opciones, datos, etc. Tenemos un PDC con windows 2000 y el toba lo tenemos funcionando en un servidor con la distribución 5.2 de centos.
Estamos con la versión 1.5.0 y paso a detallarte la manera en que logramos hacerlo andar. Pido disculpas si en alguna versión posterior esto se resuelve de otro modo. En realidad encontramos, por lo menos en esta versión, algunas funciones en el nucleo de toba que soportan autenticación ldap y lo que hicimos fue trabajar en estas funciones. Las mismas son la función autenticar que se encuentran en toba/1.5.0/php/nucleo/lib/toba_manejador_sesiones.php y la función autenticar_ldap que se encuentra en toba/1.5.0/php/nucleo/lib/toba_usuario_basico.php.
Los cambios que relizamos son los siguientes:

  1. Realizar cambios en …toba/1.5.0/php/nucleo/lib/toba_manejador_sesiones.php, buscar la función “autenticar”, y en la linea 786 realizar los cambios necesarios para que esa linea quede: $estado = $this->invocar_metodo_usuario(‘autenticar_ldap’, array($id_usuario, $clave, $datos_iniciales) ); (se le agrega “_ldap”)
  2. Realizar cambios en: …toba/1.5.0/php/nucleo/lib/toba_usuario_basico.php. Transcribo a continuación la función completa, en la cual habría que definirle los parámetros que correspondan en cada caso al dominio o active directory y al PDC: (una cosa que me volvió loco encontrar la solución fue en la función ldap_search original que tenía el toba. Allí utilizaba un parámetro uid de ldap para realizar la búsqueda. En mi caso particular, no se si porque es windows 2000, no funcionaba. Buscando, encontré el parámetro samaccountname que funcionó de manera correcta. Otro cambio fue en la función ldap_bind, en la cual le agregué el usuario y contraseña. En mi caso particular, no funcionó sin estos datos. Acordate de colocar los datos de tu dominio y pdc dentro de la función que te mando)

/**

  • Realiza la autentificacion utilizando un servidor LDAP
  • @return $value Retorna TRUE o FALSE de acuerdo al estado de la autentifiacion
    */
    static function autenticar_ldap($id_usuario, $clave, $datos_iniciales=null)
    { $ad_usuario=$id_usuario.‘@economicas.local’;
    if (! extension_loaded(‘ldap’)) {
    throw new toba_error(“[Autenticación LDAP] no se encuentra habilitada la extensión LDAP”);
    }
    // $dn = ‘dc=siu,dc=edu,dc=ar’;
    // $host = ‘localhost’;
    $dn = ‘dc=economicas,dc=local’;
    $host = ‘192.168.0.2’;
    $conexion = @ldap_connect($host);
    ldap_set_option($conexion, LDAP_OPT_PROTOCOL_VERSION, 3);

if (! $conexion) {
toba::logger()->error('[Autenticación LDAP] No es posible conectarse con el servidor: '.ldap_error($conexion));
return false;
}

$bind = @ldap_bind($conexion, $ad_usuario, $clave);
if (! $bind) {
toba::logger()->error('[Autenticación LDAP] No es posible conectarse con el servidor: ‘.ldap_error($conexion));
return false;
}
$res_id = @ldap_search($conexion, “$dn”, “samaccountname=$id_usuario”);
if (! $res_id) {
toba::logger()->error(’[Autenticación LDAP] Fallo búsqueda en el árbol: '.ldap_error($conexion));
return false;
}

$cantidad = ldap_count_entries($conexion, $res_id);
if ($cantidad == 0) {
toba::logger()->error(“[Autenticación LDAP] El usuario $id_usuario no tiene una entrada en el árbol”);
return false;
}

if ($cantidad > 1) {
toba::logger()->error(“[Autenticación LDAP] El usuario $id_usuario tiene más de una entrada en el árbol”);
return false;
}

$entrada_id = ldap_first_entry($conexion, $res_id);

if ($entrada_id == false) {
toba::logger()->error(“[Autenticación LDAP] No puede obtenerse el resultado de la búsqueda”. ldap_error($conexion));
return false;
}

$usuario_dn = ldap_get_dn($conexion, $entrada_id);
if ($usuario_dn == false) {
toba::logger()->error("[Autenticación LDAP] No pude obtenerse el DN del usuario: ". ldap_error($conexion));
return false;
}

$link_id = @ldap_bind($conexion, $usuario_dn, $clave);
if ($link_id == false) {
toba::logger()->error(“[Autenticación LDAP] Usuario/Contraseña incorrecta: “.ldap_error($conexion));
return false;
}
ldap_close($conexion);
toba::logger()->debug(”[Autenticación LDAP] OK”);
return true;
}

//----------------------------------------------------------------------------------

Por último, no olvides agregar a todos los usuarios del dominio que utilicen sistemas en toba al toba_usuarios. QUizás haya alguna manera de hacerlo mediante un php que vaya leyendo cada usuario del dominio o active directory y agregando en la base de toba. La contraseña de cada usuario en la base de toba no tiene importancia, ya que la autenticación es contra el pdc.
Espero que sirva de algo. Quedo a tu disposición si necesitás alguna aclaración al respecto.
Un abrazo.