Linux - Búsqueda con LDAP - PHP

 
Vista:

Búsqueda con LDAP - PHP

Publicado por Elizabeth (2 intervenciones) el 12/08/2011 16:35:22
Hola, les escribo porque estoy optimizando mi código para autenticación con LDAP de la empresa.

Les cuento, cuando se inicia sesión, primero hago la conexión con LDAP de la empresa, verifico que el username y password sean iguales a los registrados para conocer si pertenece a la empresa y si todo es correcto, lo verifico en una tabla de BD que son los usuarios que pueden utilizar el sistema, es decir, no todos los emplead ode la empresa pueden utilizar el sistema.

El caso es que todo me funciona para inicio de sesión.

Existe un módulo que lo utiliza el administrador de la página, el cual va a tener la potestad de incluir o no a los usuarios para utilizar dicho sistema. Lo que quiero hacer es realizar dicha validación de verificar con LDAP antes de registrar o modificar el username de un usuario nuevo o ya existente.

Lo he realizado con las funciones de ldap_search y ldap_compare, siguiendo los ejemplos que ponen en el API de PHP, pero siempre me aparece que algo no es válido.

Verifique el nombre del atributo al cual buscar/comparar ... pero me sigue dando el mismo error..

Les muestro los códigos para ver si me pueden ayudar:

Utilizando ldap_search:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
function busquedaLDAP($username, $password){
 
     $ldapconn = conectarLDAP();
 
    // Verificación del establecimiento de la conexión con algún servidor
    if(!$ldapconn[0] && !$ldapconn[1]) {
 
        // Conexión Fallida. Devuelve código de error asociado (1)
        return 1;
 
    // Alguna conexión Exitosa
    } else {
 
        // Nombre Relativo Distinguido del usuario en el LDAP
        $ldaprdn = $username;
 
        // Contraseña del usuario en el Directorio Activo
        $ldappass = $password;
 
        // Realizando la autenticación del usuario en el(los) servidor(es) LDAP
        // conectado(s)
        $ldapbind  = autenticarLDAP($ldapconn[0], $ldaprdn, $ldappass);
        $ldapbind2 = autenticarLDAP($ldapconn[1], $ldaprdn, $ldappass);
 
        // Verificación del enlace resultante
        if ($ldapbind || $ldapbind2) {
 
            $busqueda=ldap_search($ldapconn,"ou=Users,dc=intra", "samAccountName=$username");
 
                $values = ldap_get_values($ldapconn, $busqueda);
 
                echo $values["count"] . " resultados de la búsqueda.<br />";
 
                for ($i=0; $i < $values["count"]; $i++) {
                    echo $values[$i] . "<br />";
                }
 
              /*  $info = ldap_get_entries($ldapconn, $busqueda);

                echo $info["count"]["Users"] ." entradas devueltas\n";*/
 
                desconectarLDAP($ldapconn[0]);
                desconectarLDAP($ldapconn[1]);
 
                // Autenticación Exitosa (usuario pertenece a Activo). Devuelve código de éxito (0)
                return 0;
 
 
        } else {
 
            desconectarLDAP($ldapconn[0]);
            desconectarLDAP($ldapconn[1]);
 
            // Autenticación Fallida (usuario no pertenece a directorio Activo). Devuelve código de error asociado (2)
            return 2;
 
        }
 
    }
 
}


El error que me arroja es : Warning: Wrong parameter count for ldap_get_values()

Utilizanzo ldap_compare:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
function busquedaLDAP($username, $password){
 
     $ldapconn = conectarLDAP();
 
    // Verificación del establecimiento de la conexión con algún servidor
    if(!$ldapconn[0] && !$ldapconn[1]) {
 
        // Conexión Fallida. Devuelve código de error asociado (1)
        return 1;
 
    // Alguna conexión Exitosa
    } else {
 
        // Nombre Relativo Distinguido del usuario en el LDAP 
        $ldaprdn = $username;
 
        // Contraseña del usuario en el Directorio Activo
        $ldappass = $password;
 
        // Realizando la autenticación del usuario en el(los) servidor(es) LDAP
        // conectado(s)
        $ldapbind  = autenticarLDAP($ldapconn[0], $ldaprdn, $ldappass);
        $ldapbind2 = autenticarLDAP($ldapconn[1], $ldaprdn, $ldappass);
 
        // Verificación del enlace resultante
        if ($ldapbind || $ldapbind2) {
 
            $dn = "ou=Users, dc=intra";
            $value = "samAccountName";
            $attr = "$username";
 
            // compare value
            $r=ldap_compare($ldapconn, $dn, $attr, $value);
 
            if ($r === -1) {
                echo "Error: ".ldap_error($ldapconn);
 
            } elseif ($r === TRUE) {
 
                echo "Username correct.";
                desconectarLDAP($ldapconn[0]);
                desconectarLDAP($ldapconn[1]);
 
                // Autenticación Exitosa (usuario pertenece a directorio Activo). Devuelve código de éxito (0)
                return 0;
 
            } elseif ($r === FALSE) {
                echo "Wrong guess! Username incorrect.";
 
                desconectarLDAP($ldapconn[0]);
                desconectarLDAP($ldapconn[1]);
 
                // Autenticación Fallida (usuario no pertenece a directorio Activo). Devuelve código de error asociado (2)
                return 2;
 
            }
 
        }
 
    }
}


Y el error que me arroja es : ldap_compare(): supplied argument is not a valid ldap link resource

La llamada a la función es la siguiente:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// Obtener valores de campos del formulario de ingreso de usuario
    $username     = $_POST['username'];
    $rol        = $_POST['rol'];
 
         // Verificar si el usuario a registrar pertenece al Directorio Activo
 
        $verificaLDAP = busquedaLDAP($username, $password);
 
        // El nombre de usuario pertenece al Directorio Activo
        if ($verificarLDAP == 0){
 
            // Verificar si el nombre del usuario a registrar ya está siendo 
            // utilizado en el sistema
            $yaExiste = perteneceSPO2($username);
 
            //El nombre de usuario ya se encuentra registrado
            if($yaExiste){
 
                // Volver a formulario de ingreso de usuario
                $_SESSION['error']          = 3;
                $_SESSION['errorUsername'] = $username;
                $_SESSION['errorRol']      = $rol;
                $_SESSION['errorDiscU']    = $disciplina;
                $_SESSION['errorOficU']    = $oficina;
                header("Location: agregarUsuario.php");
 
            // El nombre de usuario no se encuentra registrado en el sistema
            } else {
 
                // Registrar los datos del nuevo usuario en la BD.
                insertarNuevoUsuario($username, $disciplina, $oficina, $rol);
 
                // Volver a página de presentación del módulo de perfiles de usuario, 
                // mostrando mensaje de éxito correspondiente
                $_SESSION['exito'] = 1;
                $_SESSION['errorUsername']    = NULL;
                $_SESSION['errorRol']         = NULL;
                $_SESSION['errorOficU']       = NULL;
                $_SESSION['errorDiscU']       = NULL;
                header("Location: principal_cuentas.php");
 
            }
        }
        // El nombre de usuario no pertenece al Directorio Activo 
        else {
 
                // Volver a formulario de ingreso de usuario
                $_SESSION['error']          = 3;
                $_SESSION['errorUsername'] = $username;
                $_SESSION['errorRol']      = $rol;
                $_SESSION['errorDiscU']    = $disciplina;
                $_SESSION['errorOficU']    = $oficina;
                header("Location: agregarUsuario.php");
 
        }


Espero me puedan ayudar, ya que es algo urgente.

Gracias de antemano!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Búsqueda con LDAP - PHP

Publicado por Elizabeth (2 intervenciones) el 15/08/2011 19:58:08
Hola, Que tal? Ya intente con otro código y solventé los errores anteriores, pero todavía sigo teniendo problemas con LDAP. Lo que me sucede es que cuando intento hacer una nueva conexión, como que no me lo hace y cae directo al condicional en donde me trae como resultado "0", cuando lo que debería hacer es entrar en el condicional para realizar la comparación, pero esto no sucede.

Implementé hacer la llamada a la función ldap_unbind, la cual cierra la sesión de Ldap antes de volverme a conectar, pero tampoco funciona...

Será que alquien me podría brindar una solución?

Gracias de Antemano.

Aqui el código de las funciones:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
function conectarLDAP(){
 
    // Definición de datos de conexión de LDAP - Active Directory de la 
    // intranet 
 
    // Host (Dirección IP) en que se aloja(n) el(los) servidor(es) LDAP
    $ldaphost  = "10.x.x.x";
    $ldaphost2 = "10.x.x.x";
 
    // Puerto para conectarse a cualquiera de los servidores LDAP (puerto 
    // por defecto)
    $ldapport = 389;
 
    // Fin de definición de datos de conexión de LDAP - Active 
    // Directory de la intrane
 
    // Intento(s) de Conexión al(los) servidor(es) LDAP
    $ldapconn  = @ldap_connect($ldaphost,  $ldapport);
    $ldapconn2 = @ldap_connect($ldaphost2, $ldapport);
 
    return array($ldapconn, $ldapconn2);
 
}
 
 
function autenticarLDAP($ldapconn, $ldaprdn, $ldappass){
 
    $ldapbind = @ldap_bind($ldapconn, $ldaprdn, $ldappass);
 
    return $ldapbind;
 
}
 
 
function desconectarLDAP($ldapconn){
 
    ldap_close($ldapconn);
 
}
 
 
function getAllInfoLDAP($username,$ldapconn){
        $dn="OU=Users,DC=tp";
        $valor = "$username";
        $atributo = "samaccountname";
 
        // comparar los valores
        $r=ldap_compare($ldapconn, $dn, $atributo, $valor);
 
        return $r;
}
 
 
function LDAP($userActual,$password,$username){
 
 
// $userActual = nombre distintivo y único del administrador ya autentificado.
//$password = contraseña del administrador ya autentificado.
//$username = nombre distintivo y unico del usuario a ingresar/modificar.
 
        $ldapconn = conectarLDAP();
 
        $ldaprdn = 'TP\\' . $userActual;
        $ldappass = $password;
 
        $ldapbind  = autenticarLDAP($ldapconn[0], $ldaprdn, $ldappass);
        $ldapbind2 = autenticarLDAP($ldapconn[1], $ldaprdn, $ldappass);
 
        if(!$ldapbind || !$ldapbind2){
 
            $f= getAllInfoLDAP($username,$ldapconn);
 
            if ($f === true) {
 
                desconectarLDAP($ldapconn[0]);
                desconectarLDAP($ldapconn[1]);
                return 0;
 
            } else {
 
                desconectarLDAP($ldapconn[0]);
                desconectarLDAP($ldapconn[1]);
                return 1;
            }
        } else {
 
                desconectarLDAP($ldapconn[0]);
                desconectarLDAP($ldapconn[1]);
                return 4;
        }
 
}


Aqui la llamada a la función:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$verificaLDAP = LDAP($userActual,$password,$username);
        // El nombre de usuario pertenece al Directorio Activo 
        echo "VALOR $verificaLDAP";
        if ($verificarLDAP == 0){
 
            // Verificar si el nombre del usuario a registrar ya está siendo 
            // utilizado en el sistema
 
            $yaExiste = perteneceSPO2($username);
 
            //El nombre de usuario ya se encuentra registrado
            if($yaExiste){
                echo " YA EXISTE USUARIO ";
 
            // El nombre de usuario no se encuentra registrado en el sistema
            } else {
 
                // Registrar los datos del nuevo usuario en la BD.
                insertarNuevoUsuario($username, $disciplina, $oficina, $rol);
 
                // Volver a página de presentación del módulo de perfiles de usuario, 
                // mostrando mensaje de éxito correspondiente
            }
        }
        // El nombre de usuario no pertenece al Directorio Activo 
        else {
 
                // Volver a formulario de ingreso de usuario
        }
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar