domingo, 22 de noviembre de 2015

10 - Tutorial de Laravel 5 - User Login (Autenticar usuarios)




En este capítulo del Tutorial de Laravel 5 continuamos con el sistema de usuarios, en el capítulo anterior ya finalizamos con el registro de usuarios, en éste, nos basaremos en la autenticación.

Para estructurar la página primero agregaremos un menú en el layout para facilitar el acceso a las distintas secciones a los usuarios.

El código del menú es el siguiente y lo agregaremos justo después de la etiqueta body al layout "home.blade.php":

    <nav class="navbar navbar-default navbar-fixed-top">
      <div class="container">
        <div class="navbar-header">
          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
            <span class="sr-only">Toggle navigation</span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </button>
          <a class="navbar-brand" href="{{url()}}">Tutorial Laravel</a>
        </div>
        <div id="navbar" class="navbar-collapse collapse">
          <ul class="nav navbar-nav">
            <li><a href="{{url()}}">Inicio</a></li>
          </ul>
          <ul class="nav navbar-nav navbar-right">
   @if (Auth::check())
   <li><a href="{{url()}}">{{Auth::user()->name}}</a></li>
   <li><a href="{{url('auth/logout')}}">Salir</a></li>
   @else
            <li><a href="{{url('auth/login')}}">Iniciar sesión</a></li>
   @endif
          </ul>
        </div>
      </div>
    </nav>


Al container del layout le daremos un margin-top de 50px para evitar que el contenido quede detrás del menú:

        <div class="container" style='margin-top: 50px;'>
            @yield('content')
        </div>


También modificaremos la página de inicio, en lugar de mantener "welcome" que es la que viene por defecto al instalar Laravel 5, crearemos una nueva. Eliminaremos la ruta en routes.php que cargar esta vista y en su lugar agregaremos las dos siguientes:

Route::get('/', 'HomeController@home');
Route::get('/home', 'HomeController@home');


Como podéis ver la página de inicio ahora está asociada a la acción "home" del controlador HomeController, crearemos esta nueva acción en HomeController:

    public function home(){
        return View('home.home');
    }


Y crearemos la nueva vista "home.blade.php" en la carpeta "home" de las vistas, con el siguiente código:

@extends('layouts.home')

@section('content')
<h1>Bienvenid@s a la aplicación Laravel</h1>
@stop


A continuación crearemos el formulario de login en una vista llamada "login.blade.php" en la carpeta "auth" de las vistas:

@extends('layouts.home')

@section('content')
 <h1>Iniciar sesión</h1>
 
 <div class="container text-danger">
  @if (Session::has('message'))
   {{Session::get('message')}}
  @endif
 </div>
 <hr />
 <form method="post" action="{{url('auth/login')}}">
  {{csrf_field()}}
  <div class="form-group">
   <label for="email">Email:</label>
   <input type="email" name="email" class="form-control" value="{{Input::old('email')}}" />
   <div class="text-danger">{{$errors->first('email')}}</div>
  </div>
  <div class="form-group">
   <label for="password">Password:</label>
   <input type="password" name="password" class="form-control" />
   <div class="text-danger">{{$errors->first('password')}}</div>
  </div>
  <div class="form-group">
   <label for="remember">No cerrar sesión:</label>
   <input type="checkbox" name="remember" />
  </div>
  <button type="submit" class="btn btn-primary">Iniciar sesión</button>
 </form>
 <br /><br />
 <a href="{{url('auth/register')}}">Registrarme</a>
@stop




Crearemos las nuevas rutas en "routes.php" asociándolas a las acciones predefinidas en la clase AuthenticatesAndRegistersUsers:

Route::get('auth/login', 'Auth\AuthController@getLogin');
Route::post('auth/login', 'Auth\AuthController@postLogin');
Route::get('auth/logout', 'Auth\AuthController@getLogout');


Agregaremos la clase "Auth" al controlador AuthController:

use Auth;


Crearemos la acción postLogin para autenticar los usuarios en el controlador AuthController:

    public function postLogin(Request $request){
        
        if (Auth::attempt(
                [
                    'email' => $request->email,
                    'password' => $request->password,
                    'active' => 1
                ]
                , $request->has('remember')
                )){
            return redirect()->intended($this->redirectPath());
        }
        else{
            $rules = [
                'email' => 'required|email',
                'password' => 'required',
            ];
            
            $messages = [
                'email.required' => 'El campo email es requerido',
                'email.email' => 'El formato de email es incorrecto',
                'password.required' => 'El campo password es requerido',
            ];
            
            $validator = Validator::make($request->all(), $rules, $messages);
            
            return redirect('auth/login')
            ->withErrors($validator)
            ->withInput()
            ->with('message', 'Error al iniciar sesión');
        }
    }


Finalmente abriremos el archivo "session.php" que se encuentra en la carpeta "config" para modificar la siguiente clave a true:

'expire_on_close' => true,


Esto permitirá tener dos alternativas a elección del usuario: mantener la sesión iniciada ó cerrar la sesión tras cerrar el navegador.

También veremos por encima como trabaja "Middleware" para controlar el acceso de usuarios invitados o autenticados a las diferentes secciones de la web.