Laravel 4 desde Cero: Sesiones

Publicado el 24 enero 2014 por Codehero @codeheroblog
CREATE TABLE `usuarios` ( `id` int(11) NOT NULL AUTO_INCREMENT, `nombre` varchar(255) NOT NULL, `correo` varchar(255) NOT NULL, `password` varchar(255) NOT NULL, `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

123456789 CREATE TABLE`usuarios`(  `id`int(11)NOTNULLAUTO_INCREMENT,  `nombre`varchar(255)NOTNULL,  `correo`varchar(255)NOTNULL,  `password`varchar(255)NOTNULL,  `created_at`timestamp NOTNULLDEFAULTCURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,  `updated_at`timestamp NOTNULLDEFAULT'0000-00-00 00:00:00',  PRIMARY KEY(`id`))ENGINE=InnoDB  DEFAULTCHARSET=latin1 AUTO_INCREMENT=1;

Con nuestra tabla creada en la base de datos vamos a pasar a crear la vista que estaremos usando para este tutorial, para esto creamos el archivo login.blade.php en la carpeta de views.

<h2> Ingresar </h2> @if (Session::has('mensaje_login')) <span>{{ Session::get('mensaje_login') }}</span> @endif {{ Form::open(array('url' => 'login')) }} {{ Form::label('correo', 'Correo'); }} {{ Form::text('correo'); }} {{ Form::label('password', 'Clave'); }} {{ Form::password('password'); }} {{ Form::submit('Ingresar'); }} {{ Form::close() }} <h2> Registro </h2> @if (Session::has('mensaje_registro')) <span>{{ Session::get('mensaje_registro') }}</span> @endif {{ Form::open(array('url' => 'registro')) }} {{ Form::label('nombre', 'Nombre'); }} {{ Form::text('nombre'); }} {{ Form::label('correo', 'Correo'); }} {{ Form::text('correo'); }} {{ Form::label('password', 'Clave'); }} {{ Form::password('password'); }} {{ Form::submit('Registrar'); }} {{ Form::close() }}

12345678910111213141516171819202122232425262728293031323334353637383940414243444546 <h2>  Ingresar  </h2> @if(Session::has('mensaje_login'))    <span>{{Session::get('mensaje_login')}}</span>@endif {{Form::open(array('url'=>'login'))}}    {{Form::label('correo','Correo');}}  {{Form::text('correo');}}  {{Form::label('password','Clave');}}  {{Form::password('password');}}  {{Form::submit('Ingresar');}} {{Form::close()}} <h2>  Registro  </h2>@if(Session::has('mensaje_registro'))    <span>{{Session::get('mensaje_registro')}}</span>@endif {{Form::open(array('url'=>'registro'))}}    {{Form::label('nombre','Nombre');}}  {{Form::text('nombre');}}  {{Form::label('correo','Correo');}}  {{Form::text('correo');}}  {{Form::label('password','Clave');}}  {{Form::password('password');}}  {{Form::submit('Registrar');}} {{Form::close()}}

Como podemos observar en la misma vista tenemos el formulario de login y el formulario de registro, de esta manera nos ahorramos un poco de trabajo para este tutorial.

Ahora vamos a crear el modelo para los usuarios que se registraran en el sistema y le colocamos el nombre Usuarios.php. En esta ocasión vamos a implementar una interfaz en el modelo, para que Laravel lo pueda usar para inicio de sesión. La interfaz a implementar sera UserInterface y a continuación podemos observar el código final del modelo.

// se debe indicar en donde esta la interfaz a implementar use Illuminate\Auth\UserInterface; Class Usuarios extends Eloquent implements UserInterface{ protected $table = 'usuarios'; protected $fillable = array('nombre', 'correo', 'password'); // este metodo se debe implementar por la interfaz public function getAuthIdentifier() { return $this->getKey(); } //este metodo se debe implementar por la interfaz // y sirve para obtener la clave al momento de validar el inicio de sesión public function getAuthPassword() { return $this->password; } }

12345678910111213141516171819202122 // se debe indicar en donde esta la interfaz a implementaruseIlluminate\Auth\UserInterface;ClassUsuariosextendsEloquentimplementsUserInterface{   protected$table='usuarios';  protected$fillable=array('nombre','correo','password');   // este metodo se debe implementar por la interfaz  publicfunctiongetAuthIdentifier()  {  return$this->getKey();  }    //este metodo se debe implementar por la interfaz  // y sirve para obtener la clave al momento de validar el inicio de sesión   publicfunctiongetAuthPassword()  {  return$this->password;  }  }

Con Usuarios.php creado y el código del mismo listo, vamos a pasar a decirle a Laravel que los usuarios y claves están en este modelo. Para esto debemos entrar al archivo de configuración app/config/auth.php y revisar dos parámetros. El primero sera 'driver'=>'eloquent', lo mas seguro es que ya este así y esto le dice a Laravel que vamos a utilizar un modelo para guardar los usuarios que harán login. El segundo parámetro sera 'model'=>'Usuarios', este le indica a Laravel que el modelo a utilizar es Usuarios.

El último paso que falta es crear las rutas y lógica que controlara todo lo que hemos hecho hasta ahora. Pero primero tenemos que entender que para un sistema con login tenga sentido deben haber rutas para las cuales se necesite haber iniciado sesión y otras que no. Esto en Laravel se hace de manera sencilla con los filtros y ya el framework tiene uno llamado auth. Este filtro se puede encontrar en el archivo app/filers.php. No es necesario ningún cambio pero siempre es bueno saber donde esta y para que sirve.

Ahora que tenemos esto claro podemos crear las rutas con la lógica de nuestro ejemplo de login. Para esto vamos a crear la siguientes rutas:

// esta sera la ruta principal de nuestra aplicación // aquí va a estar el formulario para registrase y para inicio de sesión // esta ruta debe ser publica y por lo tanto no debe llegar el filtro auth Route::get('login', function(){ return View::make('login'); }); // esta ruta sera para crear al usuario Route::post('registro', function(){ $input = Input::all(); // al momento de crear el usuario la clave debe ser encriptada // para utilizamos la función estática make de la clase Hash // esta función encripta el texto para que sea almacenado de manera segura $input['clave'] = Hash::make($input['clave']); Usuarios::create($input); return Redirect::to('login')->with('mensaje_registro', 'Usuario Registrado'); }); // esta ruta servirá para iniciar la sesión por medio del correo y la clave // para esto utilizamos la función estática attemp de la clase Auth // esta función recibe como parámetro un arreglo con el correo y la clave Route::post('login', function(){ // la función attempt se encarga automáticamente se hacer la encriptación de la clave para ser comparada con la que esta en la base de datos. if (Auth::attempt( array('correo' => Input::get('correo'), 'password' => Input::get('password') ), true )){ return Redirect::to('inicio'); }else{ return Redirect::to('login')->with('mensaje_login', 'Ingreso invalido'); } }); // Por ultimo crearemos un grupo con el filtro auth. // Para todas estas rutas el usuario debe haber iniciado sesión. // En caso de que se intente entrar y el usuario haya iniciado session // entonces sera redirigido a la ruta login Route::group(array('before' => 'auth'), function() { Route::get('inicio', function(){ echo 'Bienvenido '; // Con la función Auth::user() podemos obtener cualquier dato del usuario // que este en la sesión, en este caso usamos su correo y su id // Esta función esta disponible en cualquier parte del código // siempre y cuando haya un usuario con sesión iniciada echo 'Bienvenido '. Auth::user()->correo . ', su Id es: '.Auth::user()->id ; }); });

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 // esta sera la ruta principal de nuestra aplicación// aquí va a estar el formulario para registrase y para inicio de sesión// esta ruta debe ser publica y por lo tanto no debe llegar el filtro authRoute::get('login',function(){  returnView::make('login');}); // esta ruta sera para crear al usuario Route::post('registro',function(){   $input=Input::all();    // al momento de crear el usuario la clave debe ser encriptada  // para utilizamos la función estática make de la clase Hash  // esta función encripta el texto para que sea almacenado de manera segura  $input['clave']=Hash::make($input['clave']);  Usuarios::create($input);   returnRedirect::to('login')->with('mensaje_registro','Usuario Registrado');}); // esta ruta servirá para iniciar la sesión por medio del correo y la clave // para esto utilizamos la función estática attemp de la clase Auth// esta función recibe como parámetro un arreglo con el correo y la claveRoute::post('login',function(){   // la función attempt se encarga automáticamente se hacer la encriptación de la clave para ser comparada con la que esta en la base de datos.   if(Auth::attempt(array('correo'=>Input::get('correo'),'password'=>Input::get('password')),true)){  returnRedirect::to('inicio');  }else{  returnRedirect::to('login')->with('mensaje_login','Ingreso invalido');  } }); // Por ultimo crearemos un grupo con el filtro auth. // Para todas estas rutas el usuario debe haber iniciado sesión. // En caso de que se intente entrar y el usuario haya iniciado session // entonces sera redirigido a la ruta loginRoute::group(array('before'=>'auth'),function(){    Route::get('inicio',function(){  echo'Bienvenido ';    // Con la función Auth::user() podemos obtener cualquier dato del usuario   // que este en la sesión, en este caso usamos su correo y su id  // Esta función esta disponible en cualquier parte del código  // siempre y cuando haya un usuario con sesión iniciada  echo'Bienvenido 'Auth::user()->correo', su Id es: 'Auth::user()->id;  });});

Ahora podemos probar nuestro código entrando a la ruta login y registrar usuarios para que luego inicien sesión.


Conclusión

Como podemos ver Laravel nos permite un manejo sencillo de las sesiones, que son una parte muy importante en nuestros proyectos y teniendo en cuenta la seguridad de las claves. En nuestro próximo capítulo aprenderemos más funciones que nos brinda Laravel para el manejo de sesiones. Cualquier duda o comentario estaré atento a la sección de comentarios.