OBTENIDO FORO: jOOMLA SPANISH – AUTOR FEDY
En primer lugar he creado un archivo llamado validLDAP.php en el directorio raiz y que unicamente lleva la variable $mosConfig_login_LDAP = true; esto es únicamente para que simplemente cambiando la contraseña a true o false, pueda validarme mediante el LDAP o el sistema tradicional de Joomla. Tienes dos opciones, o en la tabla users de Joomla introduces los usuarios de windows en el campo username o, haces como yo, busco en el LDAP el usuario, leo los datos que hay del usuario, uno de ellos es su cuenta de correo, y ésta es la que busco en la base de datos de Joomla.
En el fichero includes/joomla.php busca la funcion login y antes de la línea:
$passwd = md5( $passwd );
insertas esta:
$passwdLDAP = $passwd;
Esto lo hacemos porque en LDAP tenemos que buscar la contraseña en texto plano, encriptada con md5 no nos sirve, te quedaría así:
$passwdLDAP = $passwd;
$passwd = md5( $passwd );
A continuación, después de:
$row = null;
if (!$username || !$passwd) {
mosErrorAlert( _LOGIN_INCOMPLETE );
exit();
} else {
if ( $remember && strlen($username) == 32 && strlen($passwd) == 32 && $userid ) {
// query used for remember me cookie
$harden = mosHash( @$_SERVER['HTTP_USER_AGENT'] );
$query = "SELECT id, name, username, password, usertype, block, gid"
. "\n FROM #__users"
. "\n WHERE id = " . (int) $userid
;
$this->_db->setQuery( $query );
$this->_db->loadObject($user);
$check_username = md5( $user->username . $harden );
$check_password = md5( $user->password . $harden );
if (
$check_username == $username && $check_password == $passwd ) {
$row = $user;
}
añades
} else {
include_once(
$mosConfig_absolute_path .'/validLDAP.php' );
$validadoLDAP = false;
if ($mosConfig_login_LDAP) {
$DatosUsuario = validacionActiveDirectory($username, $passwdLDAP);
if ($DatosUsuario){
$validadoLDAP = true;
$username = strtolower(trim( $DatosUsuario['email'] ));
$query = "SELECT id, name, username, password, usertype, block, gid"
. "\n FROM #__users"
. "\n WHERE email= ". $this->_db->Quote( $username )
;
$this->_db->setQuery( $query );
$this->_db->loadObject( $row );
}
} else {
y luego sigue el código original:
// query used for login via login module
$query = "SELECT id, name, username, password, usertype, block, gid"
. "\n FROM #__users"
. "\n WHERE username = ". $this->_db->Quote( $username )
. "\n AND password = ". $this->_db->Quote( $passwd )
;
Después, al final del archivo, creas la función validacionActiveDirectory:
function validacionActiveDirectory($uid, $psw) {
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ds, LDAP_OPT_REFERRALS, 0);
$sroot = "dc=loquesea,dc=loquesea,dc=loquesea";
$host = "midominio.com";
$ds = @ldap_connect($host);
if (!$ds) {
// echo "Falló la conexión...<br/ >";
return false;
} else {
$validacion = @ldap_bind( $ds, $uid, $psw );
if (!$validacion) {
// echo "Falló la validación...<br/ >";
return false;
} else {
$ActiveDirectory = array();
$ArrayCampos = array( "ou", "cn", "mail", "telephonenumber", "givenName", "sn", "displayName");
$sr = @ldap_search($ds, $sroot, "samaccountname=$uid", $ArrayCampos);
// $sr = @ldap_search($ds, $sroot, "samaccountname=$uid"); // Así leo todos los campos.
$ad = @ldap_get_entries( $ds, $sr );
$ActiveDirectory['uid'] = $ad[0]["cn"][0];
$ActiveDirectory['email'] = $ad[0]["mail"][0];
$ActiveDirectory['telefono'] = $ad[0]["telephonenumber"][0];
$ActiveDirectory['Nombre'] = $ad[0]["givenname"][0];
$ActiveDirectory['Apellidos'] = $ad[0]["sn"][0];
$ActiveDirectory['NombApell'] = $ad[0]["displayname"][0];
return $ActiveDirectory;
}
}
} // Fin de la función validacionActiveDirectory($uid, $psw)