Usuario:ManuelRomero/Laravel/autentificacion/introduccion

De WikiEducator
Saltar a: navegación, buscar


Conceptos generales

  • La autentificación es otra de las muchas tareas comunes en cualquier aplicación que en el fondo no es parte de la aplicación sino un nivel de seguridad o compromiso que nuestra app pretende adoptar.
  • Laravel gestiona la autentificación en varios ficheros según vamos a ver a continuación.
  • Laravel nos ofrece la autentificación como un servicio.
  • Laravel tiene preconfigurada la autentificación la cual la podemos activar de manera sencilla.

Autentificación implementada en Laravel

Fichero de configuración
config/auth.php
  • Un listado de este fichero por defecto en la versión 5.2.32 (ver fichero en un proyecto para comentarios)


Icon key points.gif

Puntos clave

Como podemos ver la autentificación en Laravel está configurada por dos elementos que podemos modificar: Guards y Providers.


Icon define.gif
Guards y Providers
  • Guards definen cómo el sistema debe de almacenar y recuperar información sobre los usuarios autenticados en cada solicitud. Por ejemplo sesiones o tokens
  • Providers Definen cómo se obtienen los datos almacenados de manera persistente en el sistema. (Base de datos, tabla, campos ...)




Activando la autentificación por defecto de laravel

Usamos la línea de comandos con artisan, creamos el módulo auth en nuestra aplicación

~ ➭ php artisan make:auth
Authentication scaffolding generated successfully.
~ ➭



Icon qmark.gif
Qué ha ocurrido
1.-Se ha creado 1 controlador (app/Http/Controller/HomeController.php)


Icon activity.jpg
Otros controladores disponibles

Toda app dispone de 4 controladores para gestionar los usuarios

 app/Http/Controller/Auth
Controller auth.png



2.-Se ha añadido nuevas entradas en las rutas routes/web.app
 
//...
Auth::routes();
Route::get('/home', 'HomeController@index');
//...
3.-Se han creado las siguientes vistas /resources/view/
Laravel auth2.png




Icon activity.jpg
Controladores disponibles para autentificar
HomeController
  • Este controlador se genera al activar el módulo auth.
  • Con él podremos gestionar las solicitudes después haber sido logueados.
RegisterController
Registro del usuarios
LoginController
Gestiona la autentificación.
ForgotPasswordController
Gestión de una password olvidada por parte de un usuario
ResetPasswordController
Lógica para controlar resetear una password





Icon activity.jpg
Invocar a los formuarios
  • Podemos invocar a los formularios desde nuestra vista
   <a class="btn  href= {{ route('register') }}>REGISTRATE</a>
  <a class="btn href={{ route('login') }}>ACCEDER</a>





Icon activity.jpg
Establecer enlaces con logín
  • Los middeleware son filtros que se pueden poner antes o después de acceder a un recurso establecido en web.php
  • De esta forma podemos establecer que para acceder a determinadas páginas o recursos hay que loguearse previamente
  • Por ejemplo tenemos varias páginas con restricciones de acceso, informes, alumnos y empresas serían recursos que necesitarían login para acceder
Route::get('/about', function () {
    return view('about');
});
Route::get('/contacta', function () {
    return view('contacta');
});
 
Route::get('/alumnos', function () {
    return view('alumnos');
})->middleware('auth');
Route::get('/informes', function () {
    return view('practicas');
});
Route::get('/empresas', function () {
    return view('empresas');
})->middleware('auth');




Icon present.gif
Tip: En muchos casos, activar la autentificación por defecto es suficiente, pero conviene conocer cómo modificar determinados comportamientos por defecto



Icon activity.jpg
Actividad
  1. Página inicial una vez logueado.
  2. Campos para validar al ususario.
  3. Protegiendo rutas.




Página inicial



Icon key points.gif

Página a redirigir una vez logueado

Atributo
protected redirectTo='/home';

De los controladores:

LoginController.php
RegisterController.php
ResetPasswordController.php

Se puede especificar también el método

protected function redirectTo()
{
    return '/path';
}
Icon present.gif
Tip: El método tiene preferencia sobre el atributo



Protegiendo rutas

  • Establecer páginas o rutas, que solo se sirven si se está logueado.
  • Si tengo una ruta de una página
Route::get('/productos', 'ControladorProductos@get')
  • Si la quiero proteger con autentificación:
Route::get('/productos', 'ControladorProductos@get')->middleware('auth');







Icon key points.gif

Migraciones para la autentificación

1.-Creamos la base de datos
2.-Configuramos correctamente el fichero
config/database.php

Valores de parámetros aportados en el fichero .env UsuariosLaravelMigraciones.png

3.-Instalamos el módulo de migraciones
php artisan migrate:install
  • Nos habrá creado la tabla migration en la base de datos especificada
Migration table created successfully.
4.- Ejecutamos la migración que viene por defecto
php artisan migrate

Nos generará la siguiente salida indicando que ha creado dos tablas

Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table



(Comment.gif:

  1. Si la primera vez que intentáis registrar un usuario no deja, cierra el servidor y vuélvelo a arrancar y prueba
  2. Verifica el fichero de configuración de las conexiones
  3. Busca en stackoverflow ...

)





Icon key points.gif

Campo de validación

  • Para identificarte por defecto pide el email
  • Si quieres que solicite otro campo:
1.- Establece el nombre del campo en el controlador LoginControler
public function username(){
  return ("name"); //Ahora será este el campo por el que se validará
}
<br />
2.-Ahora toca actualizar la plantilla html que se va a visualizar
*Había estas etiquetas
<source lang=html5>
  <div class="form-group row">
    <label for="email" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label>
        <div class="col-md-6">
         <input id="email" type="email" class="form-control{{ $errors->has('email') ? ' is-invalid' : '' }}" name="email" value="{{ old('email') }}" required autofocus>
         @if ($errors->has('email'))
             <span class="invalid-feedback" role="alert">
              <strong>{{ $errors->first('email') }}</strong>
             </span>
         @endif
        </div>
  </div>

Las sustituimos por una caja de texto

3.-Actualiza la plantilla correspondiente







  • La idea es usar un milddeware, entendido como un software intermedio entre la página que solicito y la que el servidor me entrega
  • De esta forma siempre que solicite una página que necesite estar registrado, antes de servirla voy a verificar si estoy o no registrado
  • Anteriormente (en veriones 4 o anterior), este concepto se conocía como filtro, ahora en esta versión se conoce como ya hemos comentado como Middleware.
  • La idea es antes de cargar una página que se verifica ver si el usuario está autentificado
  • La descripción algorítmica sería
1.- Si  está registrado  entrego la página solicitada
2.- Si no lo está le redirijo a una página de logueo para que se acredite o registre
2.-1 Cuando lo haga le doy paso a la página solicitada
3.- En caso de no autentificarse le doy una información de error.
  • En Laravel todo está preparado y configurado, para que con unas pequeñas acciones podamos adaptar esa configuración a nuestras necesidades. Bastaría con hacer las siguientes acciones como indican en la página de referencia
 php artisan make:auth and 
php artisan migrate

Entonces acceemos a nuestra app http://localhost:8000/register

Gestionar los datos de la autentificacion

  • Por defecto tenemos un modelo llamado User con su tabla por defecto users
  • Esa tabla logicamente hay que construirla. Podemos hacerlo con migraciones.

Entre otros campos debe contener

  • campo remenber_token de 100 caracteres, permitiendo el valor nulo. Campo usado para recordar entre sesiones
  • Para incluir este campo con migraciones usaremos
$table->rememberToken()
  • Para gestionar la validación Laravel incluye el modelo app/User.php

Gestión de contraseñas

make crear una contraseña

Hash::make('secret');

check validar una contraseña

Hash::check('secret',$hashedPassword);

Tengo que volver a hacer el hash de una contraseña

if (Hash::needsRehash($hashed)) {

   $hashed = Hash::make('secret');

}