Comunidad de diseño web y desarrollo en internet

Conexión SQL Server 2008 y LDAP con PHP

Hola a todos, bienvenidos a este tutorial. Sé que este tema es muy visto por todos pero en mi caso fue un total caos para realizar una conexión a SQL Server y LDAP (Directorio Activo) con PHP.

Fue una intensa búsqueda que me llevó a mucha confusión. Así que para que no busquen más, aquí tengo la solución a estos dos temas y que les puede ayudar en sus proyectos.

Complementos a utilizar:

  • XAMPP Versión 1.7.7 Descargar
  • Librerías ADODB Descargar
  • Clase sqlserver.inc.php
  • Clase LDAPhp.class.php
  • Clase LDAPhp.php


Conexión DB SQL Server 2008 sin extensión .DLL y sin modificar el php.ini



Una vez instalado su XAMPP en su equipo de desarrollo procederemos a crear nuestro proyecto. Para realizar una conexión a nuestro SQL Server Management Studio 2008 R2 requerimos primeramente configurar un usuario de sesión para el SQL Server, el cual utilizaremos para conectarnos por PHP. Si no saben cómo realizar este procedimiento les invito entrar aqui

index.php


Para conectarnos debemos descargar la librería adodb y cargarla en nuestro directorio local. Aquí voy a hacer una consulta a SQL Server según mi BD y tabla que haya creado.

Código :

<?php
       //Mandamos llamar este archivo donde contiene la cadena de conexión a SQL Server
   include("sqlserver.inc.php");
      //Ya no usamos la clásica query de consulta como mysql_query ahora por definición de la función creada por adodb usamos la siguiente:
   $query= $db->Execute("SELECT * FROM tabla");

// Verificamos si hemos realizado bien nuestro Query
if(!$query){
        exit("Error en la consulta SQL");
} ?>

<?php //Imprimiremos el resultado
     foreach($query as $k => $row){
     echo $row["name_column"];?>
}
?>


sqlserver.inc.php


Este archivo contiene la cadena de conexión y la llamada a la librería adodb

Código :

<?php
include("adodb/adodb.inc.php");
         
         //Datos de conexión SQL Server
         $db = ADONewConnection('odbc_mssql');
         $dsn = "Driver={SQL Server};Server=localhost;Database=database;";
         //Te da informes de posibles errores, este script nos ayuda muchísimo, si tenemos un error en una consulta o insert.
         $db->debug=true;
         $db->Connect($dsn,'usuario','pass');
         
         //Variable Global por default
         $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
?>


Listo, realizando estos pasos no debe de haber ningún problema para mostrar los resultados de nuestra tabla en SQL Server, con esto podemos comprobar la conexión.

Posibles errores: Error de usuario y contraseña, permisos de lectura y ejecución en archivo adodb.inc.php.


Conexión con Directorio Activo con LDAP



Este es muy usado en escuelas en las cuales todo el personal se valida por medio de AD para poder acceder a un portal según sus privilegios. Antes de empezar debemos hacer algo muy raro que sí requiere de modificar el php.ini para descomentar el dll.

Deben descomentar la línea siguiente:
Antes

Código :

;extension=php_ldap.dll


Cambio

Código :

extension=php_ldap.dll


Listo, antes de reiniciar nuestro apache, debemos hacer algo más. Si reiniciamos el apache, éste no iniciará por lo que te dirá que no existe el archivo libsasl.dll. Para esto debemos cortar este dll que se encuentra en el directorio PHP y lo pegamos en el directorio apache. Reiniciamos y listo, debería iniciar el apache sin problemas.

Ahora que tenemos bien configurado nuestro XAMPP, comencemos:

login.php


Crearemos la forma donde nos pide el usuario y contraseña:

Código :

<form method="post" action="LDAPhp.php" name="form_ldap">
      <table cellpadding="0" cellspacing="0" border="0">
         <tr>
            <td width="79">Usuario:</td>
            <td width="392" align="left"><input type="text" name="login_username" id="login_username" onblur="aMayusculas(this.value,this.id)" /><span style="font-size:10px; color:#666666;">(L000 + Nomina)</span></td>
         </tr>
         <tr>
            <td>Contrase&ntilde;a:</td>
            <td align="left"><input type="password" name="login_userpass" id="login_userpass" onblur="aMinusculas(this.value,this.id)" /><span style="font-size:10px; color:#666666;">(Actualmente usa en su correo electronico)</span></td>
         </tr>
         <tr>
            <td colspan="2" align="right"><button id="login_userbttn">Iniciar sesion</button></td>
         </tr>
      </table>
   </form>


LDAPhp.php


Crearemos el archivo que recibe los datos de parámetros del formulario. Existen datos que deberán pedir a la persona encargada del administrador de AD, el cual debe proporcionarles un acceso.

Código :

<?php

//Importamos el manejador LDAP
require_once 'LDAPhp.class.php';

//Datos del Usuario a Autentificar con tu aplicación en PHP
//La mayoría de veces estos datos no son una constante, sino valores recibidos por $_POST[]
$usuario = $_POST["login_username"];
$clave = $_POST["login_userpass"];

//Datos de Configuración del Servidor
$servidor="host";
$puerto="123";

//Datos de Configuración para la conexión al LDAP (DN == "Distinguished Name")
$cadenaConexionUsuario = "CN=test,OU=sd,OU=campo,DC=unidad,DC=dominio,DC=ext";

//Datos de Configuración de usuario enlace LDAP-PHP, en este caso PHP (CN=PHP)
$password = 'pass';

//Datos de Configuración para el enlace al LDAP (DN == "Distinguished Name")
//En este caso nos situamos en el OU (Unidad Organizacional) principal
$dn = "OU=campo,DC=unidad,DC=dominio,DC=ext";

//Datos de Configuración de Filtro para la búsqueda de un Usuario
$filtro = "(&(objectClass=user)(samAccountName=$usuario))";

//Conectamos al servidor LDAP con los => "Datos de Configuración del Servidor"
$PHPLdap = new PHPLdap($servidor, $puerto);

//Luego de habernos conectado al servidor, enlazamos la conexion identificandonos con un password
//para el usuario PHP (CN=PHP)
$PHPLdap->enlazarPHPLdap($cadenaConexionUsuario, $password);

//Luego de haber realizado el enlace principal con el usuario PHP (CN=PHP) creado para este fin
//Procedemos a realizar la búsqueda del usuario a autenticar con la aplicación en PHP.
//PD: No se envía el usuario como parámetro ya que se encuentra interpretado en la variable: $filtro
$autenticar = $PHPLdap->autenticarUsuario($dn, $filtro, $clave);

//Verificamos el valor de retorno de la autenticación
if($autenticar===true){
//Autenticado
//Aca es donde generas la $_SESSION, COOKIES, o como manejes la autenticación
//Luego redirecciónas, a la página privada, etc.
echo '<SCRIPT LANGUAGE="javascript">location.href="../index.php";</SCRIPT>';
}
else{
//Acceso Denegado
echo " <script>
         window.alert('Acceso Denegado');
         location.href='../login.php';
      </script>";
}

//Cerramos la conexion a LDAP
$PHPLdap->cerrarConexion();
?>


LDAPhp.class.php


Requiere de la siguiente class

Código :

<?php 

class PHPLdap{
private $ds;
private $bind;

public function PHPLdap($host, $puerto){

if(!isset($this->ds)){
if($this->ds = (ldap_connect($host, $puerto))){
//echo "- LDAP conectado a: ".$host."";
}
else
{
die("- No me puedo conectar con servidor LDAP");
}
}
}

public function enlazarPHPLdap($cadenaConexionUsuario, $password){
$this->bind = @ldap_bind($this->ds, $cadenaConexionUsuario, $password);

if($this->bind){
//echo "- Se realiz&oacute; el enlace principal satisfactoriamente con el usuario PHP";
}
else
{
die("- El enlace principal no se pudo llevar a cabo");
}
}

public function autenticarUsuario($dn, $filtro, $clave){
      $busqueda=ldap_search($this->ds, $dn, $filtro);
      $resultados = ldap_get_entries($this->ds, $busqueda);
      //print_r($resultados);
      //Habiendo buscado el usuario a autenticar con "ldap_search" y obteniendo resultados en
      //un arreglo $resultados, con "ldap_get_entries", pasamos a condicionar la existencia
      //de resultados positivos.
      if($resultados["count"]>0){
         //Ingreso a la condicional, verificando con el "count" que el usuario exista
         //Quiere decir que si encontró al usuario
         //Luego obtenemos el DN (Nombre Distinguido) del usuario

         $dnUsuario = trim($resultados[0]["distinguishedname"][0]);
         //Imprimo del Arreglo las variables que necesito guardar en session.
         $nombre= trim($resultados[0]["displayname"][0]);
         $nomina= trim($resultados[0]["samaccountname"][0]);
         $correo= trim($resultados[0]["mail"][0]);
         $departamento = trim($resultados[0]["department"][0]);
         
            //Guardar Variables de Session
            session_start();
            $_SESSION['username']= $nombre;
            $_SESSION['mail'] = $correo;
            $_SESSION['nomina'] = $nomina;
            $_SESSION['depto'] = $departamento;
         
         //Para poder finalmente realizar el enlace final, siendo "enlace final" el login correcto.
         //Si y solo si... la clave es correcta

         if(@ldap_bind($this->ds, $dnUsuario, $clave)){
            //Se realiza el bind, siendo la clave correcta, y se retorna un valor VERDADERO (true)
            return true;
         }
         else
         {
            return false;
         }
      }
   }
public function cerrarConexion(){
//Cerramos la conexión a LDAP
ldap_close($this->ds);
}
}
?>


Con esto debemos de poder accesar al sitio y podremos arrastrar las variables de sesión que contienen los datos del perfil.

Y así, con este proceso, ustedes podrán hacer el proyecto que tenían atorado por conexión de bases de datos SQL y LDAP. Espero les ayude, ya que a mí me ayudó para un sinfín de tareas.

Dejen sus comentarios y acepto sugerencias!

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Publica tu comentario

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate