Artículo escrito por Garga (Traducido por teide3178)
Introducción
El objetivo de este artículo es permitir a los usuarios de GLPI poderse indentificar en la aplicación sin tener que reintroducir su usuario y contraseña.
Esta solución funciona con Apache 2 y GLPI configurado para autenticaciones externas mediante Directorio Activo. El usuario debe utilizar Internet Explorer.
La configuración sobre la cual se validó esta manipulación es ésta:
- GLPI: 0.68.2 y AD sobre W2k3 - Internet Explorer 6sp2/- XAMPP version 1.5.1/Apache 2.2.0/MySql: 5.0.18/ PHP 5.1.1
Por lo tanto si prueban sobre otra configuración y esta funciona no duden en completarlo. Parece que este patch funcionó también con Apache e IIS pero aún no he podido probarlo, sean libres ustedes de hacerlo y completar este artículo.
Finalmente una última precisión, las modificaciones así como el código proporcionado en este artículo no son mios, a parte de la adaptación de éste para la versión 0.68.2 de GLPI, muchas gracias a OUKIBILL, tsmr, blink38, VANB etc…
Instalación
Modificación en el servidor Web
Apache 2
Lo primero de todo debemos activar el módulo mod_auth_sspi.so que está incluidos en la distribución. Basta con descomentar la línea: LoadModule sspi_auth_mo módulos/mod_auth_sspi.so en el fichero de configuración de Apache (apacheconfhttpd.conf)
Es necesario añadir también (al final del mismo fichero por ejemplo):
#glpi configuration <Directory "C:/OCSinventoryNG/xampp/htdocs/glpi> Options None Order allow,deny Allow from all AuthName "Acceso Restringido" AuthType SSPI SSPIAuth On SSPIAuthoritative On SSPIOfferBasic On require valid-user </Directory>"
adaptando el path de su directorio GLPI según su configuración.
Apache
Si utilizan Apache, utiliza el mod_auth_ntlm. Basta con descomentar la línea que contiene mod_auth_ntlm en el fichero de configuración de Apache apacheconfhttpd.conf.
Puede ser también que sea necesario añadir el código al final del fichero de conf de Apache como para Apache 2 pero como no he tenido forma de probarlo, no puedo confirmarlo. Una vez más a de probarse…
IIS
Si utilizan IIS, esto irá completamente solo. Si alguien puede probarlo y confirmarlo aquí, esa sería la señal.
Modificación en GLPI
Es necesario comenzar por copiar los ficheros index.php y login.php para salvaguardar los ficheros de origen de Glpi, para poder volver de nuevo atrás en caso de problema. Personalmente les añado la extensión .orig para mayor claridad. A continuación es necesario insertar o modificar el código de index.php y login.php.
El código tal como se copia en este artículo es el resultado de un software de comparación por lo tanto la explicación de los símbolos es el siguiente:
! > : Simboliza el código que debe añadirse.
* : Simboliza una modificación del código. En nuestro caso sustituya a la 1ª estrella por la 2ª.
index.php
36 // Test si config_db n'existe pas on lance l'installation 37 38 include ("_relpos.php"); 39 include ($phproot . "/config/based_config.php"); 40 if(!file_exists($cfg_glpi["config_dir"] . "/config_db.php")) { 41 include($phproot ."/install/install.php"); 42 die(); 43 } 44 else 45 { 46 include ($phproot . "/inc/includes.php"); 47 48 // Using CAS server 49 if (!empty($cfg_glpi["cas_host"])&&!isset($_GET["noCAS"])) { 50 glpi_header("login.php"); 51 } ======= 52 !> if ( isset($_SERVER["REMOTE_USER"])){ 52 !> $pos = stripos($_SERVER["REMOTE_USER"],""); 52 !> if (! $pos === false ){ 52 !> $login = substr($_SERVER["REMOTE_USER"], $pos + 1); 52 !> if ( $login != '' ){ 52 !> header("Location: login.php?login_name=".$login); 52 !> } 52 !> } 52 !> } ======= 52 53 54 // Send UTF8 Headers 55 header("Content-Type: text/html; charset=UTF-8"); 56 // Start the page 57 58 59 echo "<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">"; 60 echo "<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">"; 61 echo "<head><title>GLPI Login</title>n"; 62 echo "<meta http-equiv="Content-Type" content="text/html; charset=utf-8 " />n"; 63 echo "<meta http-equiv="Content-Script-Type" content="text/javascript" />n"; 64 echo "<link rel='shortcut icon' type='images/x-icon' href='".$HTMLRel."pics/favicon.ico' />"; 65 66 // Appel CSS
login.php
45 $_POST=array_map('stripslashes',$_POST); 46 47 //Do login and checks 48 $user_present=1; 49 if (!isset($_POST['login_name'])) $_POST['login_name']=""; 50 $identificat = new Identification(); 51 52 $auth_succeded=false; 53 54 $_POST['login_password']=unclean_cross_side_scripting_deep($_POST['login_password']); 55 ======= 56 !> $http_auth = false; 56 !> if ( isset($_SERVER["REMOTE_USER"])){ 56 !> $pos = stripos($_SERVER["REMOTE_USER"],""); 56 !> if (! $pos === false ){ 56 !> $login = substr($_SERVER["REMOTE_USER"], $pos + 1); 56 !> if ( $login != '' ){ 56 !> $_POST['login_name'] = $login; 56 !> $http_auth = true; 56 !> } 56 !> } 56 !> } 56 !> ======= 56 if (!isset($_POST["noCAS"])&&!empty($cfg_glpi["cas_host"])) { 57 include ($phproot . "/lib/phpcas/CAS.php"); 58 phpCAS::client(CAS_VERSION_2_0,$cfg_glpi["cas_host"],intval($cfg_glpi["cas_port"]),$cfg_glpi["cas_uri"]);
66 if (!$user_present) $identificat->user->fields["name"]=$user; 67 } 68 if (isset($_POST["noCAS"])) $_SESSION["noCAS"]=1; 69 70 if (!$auth_succeded) // Pas de tests en configuration CAS ======= 71 * if (empty($_POST['login_name'])||empty($_POST['login_password'])){ * if ((empty($_POST['login_name'])||empty($_POST['login_password'])) && !$http_auth){ ======= 72 $identificat->err=$lang["login"][8]; 73 } else { 74 75 // exists=0 -> no exist 76 // exists=1 -> exist with password 77 // exists=2 -> exist without password
90 // With UTF8 decoding 91 //if (!$auth_succeded) $auth_succeded = $identificat->connection_db(utf8_decode($_POST['login_name']),utf8_decode($_POST['login_password'])); 92 //if ($auth_succeded) $user_present = $identificat->user->getFromDBbyName(utf8_decode($_POST['login_name'])); 93 ======= 94 !> } 94 !> // try HTTP authentication 94 !> if ($http_auth){ 94 !> 94 !> $found_dn=false; 94 !> $auth_succeded=0; 94 !> $found_dn=$identificat->ldap_get_dn_active_directory($cfg_glpi["ldap_host"],$cfg_glpi["ldap_basedn"],$_POST['login_name'],$cfg_glpi["ldap_rootdn"],$cfg_glpi["ldap_pass"],$cfg_glpi["ldap_port"]); 94 !> 94 !> if ($found_dn!=false){ 94 !> $auth_succeded = true; 94 !> $identificat->extauth=1; 94 !> $user_present = $identificat->user->getFromDBbyName($_POST['login_name']); 94 !> $identificat->user->getFromLDAP_active_directory($cfg_glpi["ldap_host"],$cfg_glpi["ldap_port"],$found_dn,$cfg_glpi["ldap_rootdn"],$cfg_glpi["ldap_pass"],$cfg_glpi['ldap_fields'],$_POST['login_name'],$cfg_glpi["ldap_condition"]); } ======= 94 } 95 96 // Second try IMAP/POP
Del lado de los navegadores
Internet Explorer
Es necesario comprobar bien que “Habilitar autenticación integrada de Windows” en las opciones avanzadas de Internet Explorer la casilla de verificación está activada.
Es necesario pensar en añadir la url de GLPI en la lista de los sitios de la Intranet Local bajo la pestaña Seguridad en las opciones de Internet Explorer.
Mozilla Firefox
Se va a decir que para Firefox esto no funciona.
Se dá aviso a los aficionados para encontrar una solución…..
Tsmr: Si, si funciona. Lo enumeraré en cuanto tenga un poco de tiempo pero será necesario modificar un valor en about:config
network.negociate-auth.delegation-uris: (nombre del servidor AD/LDAP)
network.negociate-auth.trusted-uris: nombre de los sitios web con autenticación integrada.
posible mediante gpo este script:
A ustedes de jugar
¡¡¡¡Aquí está todo lo que pude reunir sobre esta función pero si alquien de entre ustedes quiere mejorar el tip entonces no vacilen, soy también tomador!!!!
Dirección del post en el foro al origen del artículo: http://www.glpi-project.org/forum/viewtopic.php?id=1397&p=1