Trace: » Introducción

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…:-P

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

:es:pbauthautogood.png

   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

:es:pbauthautogood.png

 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:

http://sourceforge.net/projects/firefoxadm/

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