El problema que tengo es que una vez leo los datos del directorio LDAP, los paso por la función utf8_decode() para pasarlos a ISO-8859-1 pero me los imprime mal, como si no hubiera empleado esa función. He probado yo mismo a pasar una cadena a UTF-8 y lueo decodificarla a ISO-8859-1 y en cambio si me lo hace bien, pero con las cadenas obtenidas del directorio LDAP no me las decodifica.
Tengo el Apache configurado con el juego de caracteres ISO-8859-1, el DTD de los documentos es:
Código HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml">
Código HTML:
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
zona_registrada.php es la página para identificarse
Código PHP:
<?
// No almacenar en el cache del navegador esta página.
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Expira en fecha pasada
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // Siempre página modificada
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Pragma: no-cache"); // HTTP/1.0
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Zona Registrada</title>
</head>
<body>
<?
// Mostrar error de Autentificación.
$error_login_ms[0]="No se ha podido realizar la comprobación de los datos";
$error_login_ms[1]="NIF y/o contraseña incorrectos";
$error_login_ms[2]="No tiene permisos para acceder a esta página";
if (isset($_GET['error_login'])){
$error=$_GET['error_login'];
echo "Error: $error_login_ms[$error]";
}
?>
<form action="restringido.php" method="post">
<p>NIF:
<input name="nif" type="text" value="000000000-X">
<br />
Contraseña:
<input name="pass" type="password">
</p>
<p>
<input type="submit" name="submit" value="Entrar" />
</p>
</form>
</body>
</html
Código PHP:
<?PHP include("verifica.inc.php"); ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Página con acceso restringido!</title>
</head>
<body>
<p>Acceso Autorizado:</p>
<p> Nombre de la sesión => <? echo session_name(); ?> <br>
Usuario ID => <? echo $_SESSION['usuario']; ?><br>
Email => <? echo $_SESSION['email']; ?><br>
Nombre => <? echo $_SESSION['nombre']; ?><br>
<br>
<br>
<a href="restringido2.php">Otra página de acceso restringido</a><br>
<a href="logout.php">Salir zona restringida</a></p>
<a href="enviar.php">enviar</a></p>
</body>
</html>
Código PHP:
<?PHP
//Variables
$sesion_usuarios = "autentificacion";
// chequear pagina que lo llama para devolver errores a dicha página.
$url = explode("?",$_SERVER['HTTP_REFERER']);
$pag_referida=$url[0];
$redir=$pag_referida;
// chequear si se llama directo al script.
if ($_SERVER['HTTP_REFERER'] == ""){
die ("Acceso incorrecto! - No se invoca desde otra pgina");
exit;
}
// Chequeamos si se está AUTENTICANDO un usuario por medio del formulario
if (isset($_POST['nif']) && isset($_POST['pass'])) include("autenticacion.inc.php");
//Si no se está invocando desde el formulario... hay que comprobar que la sesión existe
else{
session_name($sesion_usuarios);
session_start();
//Se comprueba si estn creadas las variables de sesin, para evitar que si ya se ha matado funcione la tcnica de "volver atrs" en el navegador.
if (!isset($_SESSION['usuario']) && !isset($_SESSION['email']) && !isset($_SESSION['nombre'])){
session_destroy();
die ("Acceso incorrecto! - Sesión ya cerrada");
exit;
}
}
?>
Código PHP:
<?PHP
include("config.php");
//Si es así, concatenamos datos para realizar la conexión
$ldap_datos = "cn=".$_POST['nif'].",".$ldap_contenedor;
// Conexión al directorio LDAP (el flag de fallo creo que no va porque es un servidor de LDAP 2.x.x)
$ldap_conexion = @ldap_connect($ldap_host,$ldap_puerto) or die(header ("Location: $redir?error_login=0"));
// Consulta al LDAP para comprobar datos del usuario
if(@$ldap_respuesta = ldap_bind($ldap_conexion, $ldap_datos, $_POST['pass'])){
unset($_POST['pass']); //se destruye la contrasea una vez autenticado
$busqueda = ldap_search($ldap_conexion, $ldap_contenedor, "cn=".$_POST['nif']);
$info = ldap_get_entries($ldap_conexion, $busqueda);
$email = $info[0]["mail"][0];
$nombre = ucwords(strtolower(utf8_decode($info[0]["fullname"][0])));
//Una vez hecha la consulta se cierra la conexin
ldap_close($ldap_conexion);
//Usuario correcto
session_name($sesion_usuarios);
session_start();
session_cache_limiter('nocache,private'); //No cachear la pgina
$_SESSION['usuario'] = $nif;
$_SESSION['email'] = $email;
$_SESSION['nombre'] = $nombre;
//La pagina se llama a así misma para que queden disponibles la variable de sesion en el array asociado $HTTP
$pag=$_SERVER['PHP_SELF'];
Header ("Location: $pag?");
exit;
}else{
Header ("Location: $redir?error_login=1");
exit;
}
?>
Código PHP:
<?PHP
############# LDAP
$ldap_host = "xxx.xxx.xxx.xxx";
$ldap_puerto = xxxx;
$ldap_contenedor = "dc=xxxxx,dc=xxxx,dc=xx";
Perdonad si son muchos archivos, pero he intentado explicarme lo mejor posible. No he puesto los enlaces a los que se llama desde restringido.php porque son ya para cerrar la sesión o para acceder a otra páginas protegidas frente a usuarios no identificados.
Un saludo y gracias de antemano