miércoles, 18 de diciembre de 2013

Crear sesiones con session - CGI de Perl



Interesante: Vídeo Tutorial del CGI de Perl

Interesante: Vídeo Tutorial del lenguaje Perl

Bienvenid@s, en este capítulo vamos a continuar viendo una herramienta imprescindible a la hora de desarrollar aplicaciones web, como es el caso de establecer variables de sesión, si vienes de un lenguaje que trabaje del lado del servidor como PHP o ASP, ya sabes a lo que me refiero.

En este capítulo vamos a ver como establecer una sesión de usuario, si el usuario inicia sesión con sus datos de acceso correctamente podrá acceder a una zona reservada para usuarios con privilegios, de lo contrario será retornado nuevamente a la página de login.

Curiosamente el modulo CGI::Session no viene instalado por defecto, algo difícil de entender, así que se hace necesaria su instalación a través de CPAN.

Para poder instalarlo, en mi caso ha sido en XAMPP me he tenido que dirigir a la carpeta bin de perl abre una consola y dirígete a la carpeta bin de Perl ... 

cd C:\xampp\perl\bin

Despues introduce el siguiente comando ... 

cpan

Ahora es el momento de instalar el módulo CGI::Session, introduce el siguiente comando ...

install CGI::Session

Espera a que termine de instalarte el módulo.

Ok, ahora que lo tienes instalado vamos a ver el ejemplo, el archivo para iniciar sesión será el mismo que utilizamos en el capítulo anterior "login.html" http://jquery-manual.blogspot.com.es/2013/12/haciendo-consultas-la-base-de-datos-cgi.html, salvo que le introduciremos algunos cambios para poder establecer la sesión, si el usuario introduce correctamente los datos lo redirigiremos a la zona reservada para usuarios que han iniciado sesión, de lo contrario regresará a "login.html".

Así que reutilizaremos el script CGI confirmar.cgi del anterior capítulo. Abre nuevamente el archivo confirmar.cgi y copia y pega el siguiente código ...


#!"C:\xampp\perl\bin\perl.exe" 

use strict;
use CGI;
use CGI::Session(); #Módulo para la sesión
use CGI::Carp qw(fatalsToBrowser); #Muestra posibles errores en el navegador
use DBI; #Conector para la base de datos

#Se crea el objeto CGI
my $cgi = new CGI;

#Recibimos la clave y el valor de los parámetros
my $usuario = $cgi->param("usuario", $cgi->param("usuario"));
my $password = $cgi->param("password", $cgi->param("password"));

#filtrar los datos para dar seguridad a las consultas a la base de datos
if ($usuario !~ /^[a-zA-Z]+$/ || $password !~ /^[a-zA-Z]+$/)
{
#Redireccionar nuevamente a la página de login
print $cgi->header(-location => "../login.html");
exit();
}

#Datos de conexión a la base de datos
my $admin = "root";
my $pass = "password";
my $base_de_datos = "cgi";
my $servidor = "localhost";

#Se establece la conexión a la base de datos mysql
my $mysql = DBI -> connect("DBI:mysql:$base_de_datos;host=$servidor", $admin, $pass) || die "Error al conectar con la base de datos: $DBI::errstr";

#Preparamos la consulta para seleccionar datos
my $consulta = $mysql->prepare("SELECT * FROM login WHERE usuario='$usuario' AND password='$password'") || die "Error al seleccionar datos: $DBI::errstr";
#Se ejecuta la consulta
$consulta->execute();
#Se busca si existe la fila con tal usuario y password
my $encontrar = 0;
while ($consulta->fetch())
{
$encontrar = 1;
}

#Si la fila existe
if ($encontrar eq 1)
{
#Se crea un objeto para la sesión
my $session = new CGI::Session();
#Se guardan los parámetros enviados
$session->save_param($cgi);
#Indicamos que la sesión expira despues de 1 hora
$session->expires("+1h");
$session->flush();
#redirección a la zona privada
print $session->header(-location => "privado.cgi");
}
else
{
#redirección a login.html
print $cgi->header(-location => "../login.html");
exit();
}


Bien, como puedes ver el código viene comentado, es importante observar como se crea la sesión si los datos son correctos ...

#Si la fila existe
if ($encontrar eq 1)
{
#Se crea un objeto para la sesión
my $session = new CGI::Session();
#Se guardan los parámetros enviados
$session->save_param($cgi);
#Indicamos que la sesión expira despues de 1 hora
$session->expires("+1h");
$session->flush();
#redirección a la zona privada
print $session->header(-location => "privado.cgi");
}


Ok, si los datos enviados son correctos el usuario va a ser redirigido a una página llamada "privado.cgi", a este página sólo pueden tener acceso los usuarios que hayan iniciado sesión, de no ser así se les mostrará un mensaje de error y serán redirigidos al formulario login.html, guarda el archivo privado.cgi en la carpeta cgi-bin ...


#!"C:\xampp\perl\bin\perl.exe" 

use strict;
use CGI;
use CGI::Session(); #Módulo para la sesion
use CGI::Carp qw(fatalsToBrowser); #Muestra posibles errores en el navegador

#Creamos un objeto CGI
my $cgi = new CGI;

#Creamos un objeto de sesión
my $session = new CGI::Session();

#Cargamos los datos de sesión
$session->load();

#recibir todos los parámetros de sesión
my @autenticar = $session->param;

my $mensaje;
if (@autenticar eq 0) #Si el usuario no ha iniciado sesión, es decir no hay parámetros de sesión guardados
{
$mensaje = "<meta http-equiv='refresh' content='3; ../login.html'>";
$mensaje .= "Usted no tiene permisos. Será redireccionado en 3 segundos.";
}
elsif($session->is_expired) #Se la sesión ha expirado
{
$mensaje = "<meta http-equiv='refresh' content='3; ../login.html'>";
$mensaje .= "Su sesión ha expirado. Será redireccionado en 3 segundos.";
}
else #Todo ha ido correcto
{
$mensaje = "<h3>Bienvenido " . $session->param("usuario") . " a la zona reservada para usuarios registrados</h3>";
$mensaje .= "<a href='exit.cgi'>Cerrar sesión</a>";
}


print $cgi->header("text/html");
$cgi->start_html();
print $mensaje;
$cgi->end_html();


Ok, por último vamos a crear otro script para cerrar la sesión, este script únicamente nos cerrará la sesión y nos redirigirá a la página de login.html, guarda el archivo en la carpeta cgi-bin como exit.cgi ...

#!"C:\xampp\perl\bin\perl.exe" 
use strict;
use CGI;
use CGI::Session();
use CGI::Carp qw(fatalsToBrowser);
my $session = new CGI::Session();
$session->load();
$session->delete();
print $session->header(-location=>'../login.html');



Ahora puedes probar la aplicación, para ver si puedes acceder sin haber iniciado sesión a la página privado.cgi, ve a la ruta ... http://localhost/tutorial-cgi/cgi-bin/privado.cgi ... 



Ahora inicia sesión con los datos correctos, es decir, en usuario root y en password password ... 




Como puedes ver, con unos sencillos pasos hemos creado un pequeño sistema de login, esto se puede avanzar mucho más, pero lo principal ahora es coger los conceptos básicos.