php - servidor - manual de ldap
Autenticando al usuario usando LDAP desde PHP (4)
Mi proyecto es crear un sistema de inscripción de módulos para nuestra universidad. Así que me puse en contacto con la gente de TI de mi universidad para obtener detalles para autenticar a los estudiantes en el sistema. Estamos desarrollando el sistema utilizando el inicio de sesión de la universidad existente. Me dieron información LDAP, no sé el uso de eso. Estoy usando PHP, Mysql en un servidor Apacha. ¿Cómo puedo autenticar un usuario que inicia sesión en mi sistema, dado su ID de usuario y contraseña con la información LDAP?
A continuación se muestra la información de LDAP (he cambiado el nombre de dominio, etc.)
Información LDAP para el dominio blueroom.ac.uk
LDAP Host : ad.blueroom.ac.uk
LDAP port no: 389
BASE DN : ou=bluebird, dc=bluebird, dc=ac, dc=my
LDAP account to bind : cn = kikdap, ou=servacc, dc=bluebird,dc=ac,dc=uk
LDAP account password : ********
Attribute : sAMAccountName
@Stephen proporcionó buenos puntos. Aquí está mi código PHP simple para autenticar usando AD:
- primero necesita conocer estos parámetros: servidor host, dominio de usuario (también necesita base dn si desea consultar AD).
usa el siguiente código:
$ldap = ldap_connect($host); // e.g. 165.5.54.6 or an URL ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3); // Recommended for AD ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0); $bind = ldap_bind($ldap, $username.''@''.$userDomain, $passwrod); if($bind){ // successful authentication. }
El procedimiento general sería (comandos ext / ldap php relevantes entre paréntesis):
conectarse al servidor LDAP utilizando el "host LDAP" y el "puerto no LDAP" ( ldap_connect() ) y establecer las opciones de conexión correctas ( ldap_set_option() ), especialmente
LDAP_OPT_PROTOCOL_VERSION
yLDAP_OPT_REFERRALS
vincularse al servidor LDAP utilizando la "cuenta LDAP para vincular" y "contraseña de la cuenta LDAP" ( ldap_bind() ) - si se está autenticando contra un servidor de Active Directory, puede usar directamente el nombre de usuario y la contraseña desde la página de inicio de sesión y omitir todo siguientes pasos.
busque en el árbol una entrada / objeto de usuario correspondiente especificando el "DN BASE" y el filtro LDAP apropiado - muy probablemente algo como
(&(objectClass=user)(sAMAccountName=%s))
donde%s
debería ser reemplazado por el nombre de usuario para ser autenticado ( ldap_search() )compruebe si el número de entradas devueltas es 1 (si <> 1, entonces algo salió mal, por ejemplo, no se encontró usuario o se encontraron varios usuarios)
recupera el nombre ldap_get_dn() DN) de esta entrada única ( ldap_get_dn() )
use el DN que se encontró en el último paso para tratar de enlazar al servidor LDAP con la contraseña dada en la página de autenticación ( ldap_bind() )
si el enlace tiene éxito, entonces todo está bien; si no, lo más probable es que la contraseña sea incorrecta
Realmente no es tan difícil como parece al principio. En general, propongo utilizar algún tipo de biblioteca estándar para autenticar contra un servidor LDAP como el paquete Net_LDAP2
PEAR o Zend_Ldap
fuera del Zend Framework . No tengo ninguna experiencia con el uso de Net_LDAP2
(aunque conozco el código bastante bien), pero Zend_Ldap
funciona muy bien contra servidores de Active Directory o servidores ADAMS (que obviamente es con lo que estás trabajando).
Esto hará el truco usando Zend_Ldap
:
$options = array(
''host'' => ''ad.blueroom.ac.uk'',
''useStartTls'' => true,
''accountDomainName'' => ''blueroom.ac.uk'',
''accountCanonicalForm'' => 4,
''baseDn'' => ''ou=bluebird,dc=bluebird,dc=ac,dc=my'',
);
$ldap = new Zend_Ldap($options);
try {
$ldap->bind(''user'', ''password'');
} catch (Zend_Ldap_Exception $e) {
// something failed - inspect $e
}
// bind successful
$acctname = $ldap->getCanonicalAccountName(''user'', Zend_Ldap::ACCTNAME_FORM_DN);
Puede probar http://code.activestate.com/recipes/101525/ mientras se refiere a http://us3.php.net/ldap y otros resultados de una búsqueda en Google de [php ldap authentication] .
podrías usar http://pear.php.net/package/Net_LDAP2/docs , es lindo y funciona.
Ejemplo de conexión tomada por el documento:
// Inclusion of the Net_LDAP2 package:
require_once ''Net/LDAP.php'';
// The configuration array:
$config = array (
''binddn'' => ''cn=admin,ou=users,dc=example,dc=org'',
''bindpw'' => ''password'',
''basedn'' => ''dc=example,dc=org'',
''host'' => ''ldap.example.org''
);
// Connecting using the configuration:
$ldap = Net_LDAP2::connect($config);
// Testing for connection error
if (PEAR::isError($ldap)) {
die(''Could not connect to LDAP-server: ''.$ldap->getMessage());
}