Cómo crear el sistema de autenticación de usuarios en Laravel 5.7, instalando el sistema predeterminado del framework para que se puedan loguear en la aplicación con usuario y contraseña.
ACTUALIZACIÓN: Este artículo se refiere al procedimiento que se usaba antiguamente para la generación del sistema de usuarios en Laravel.
Este procedimiento cambió en Laravel 6, donde se comenzó a usar Laravel UI. Posteriormente, en Laravel 8, se introdujo Laravel Breeze, que sería la herramienta adecuada para conseguir el scaffolding básico para todo el sistema de login, registro y otras operaciones de la gestión de usuarios en las aplicaciones. Si estás en una aplicación nueva de Laravel te recomendamos estudiar Breeze.
De todos modos es relevante comentar que en el fondo ahora sigue siendo todo bastante parecido, en lo que respecta a los archivos de código para la gestión de usuarios, rutas, controladores, migraciones, pero sobre todo lo que cambia es la parte de la instalación de todas esas piezas de software en las aplicaciones limpias de Laravel.
En Laravel 5.7, igual que ocurre desde la versión 5.1, no se encuentra disponible el sistema de usuarios en la instalación inicial, por lo que tenemos que instalarlo de manera explícita. Es un proceso bastante sencillo, porque realmente está casi todo el trabajo pesado ya realizado de antemano.
En este artículo explicaremos cómo disponibilizar de nuestro sistema de autenticación, paso por paso. Verás que la mayoría de los pasos consisten en restaurar algunos componentes, como las tablas mediante el sistema de migraciones. Tendremos además que crear algunas vistas con los correspondientes formularios, rutas y poco más.
Insistimos, aunque pueda parecer mucho trabajo, mediante varios comandos Artisan es una tarea que se puede realizar en minutos.
Resumimos el procedimiento de la documentación oficial en https://laravel.com/docs/5.7/authentication Explicaremos paso por paso el procedimiento. Sin embargo, conviene estudiar el anterior enlace para encontrar más detalles.
Comando para generar las rutas y vistas
Comenzamos generando lo que sería un "scaffolding" de aplicación, es decir, una estructura báscia para que nuestra instalación de Laravel comience a parecerse a una aplicación capaz de autenticar usuarios. Consiste en una serie de rutas y vistas, las cuales son necesarias para hacer funcionar el sistema de autenticación.
Esto se resume en un único comando que nos ofrece Artisan. Lo ideal es ejecutar el comando en una instalación de Laravel recién hecha.
php artisan make:auth
Observarás, una vez ejecutado el comando, que también se han generado varias vistas en resources/views/auth. Además hay un archivo "layout" que contiene la plantilla general de la aplicación. Lo encuentras en la ruta resources/views/layouts. Si lo abres verás que usa el framework de diseño Bootstrap.
También se han generado varios controladores. Por una parte tenemos el Auth/AuthController, que nos implementa mecanismos de logueo, Auth/PasswordController para los password reset y un HomeController que nos provee del código para implementar el "dashboard" (La traducción sería escritorio, generalmente usado como punto de inicio de un panel de control de usuarios) en la ruta /home.
En Auth/AuthController hay una variable que nos permite decidir hacia donde se redirigen a los usuarios que acaban de loguearse. Inicialmente están redireccionados hacia la raíz del sitio web, pero podrías cambiarlo para que se redireccionen hacia el dashboard.
protected $redirectTo = '/home';
Guards
Existen diversos sistemas para mantener el estado de autenticación de un usuario. Laravel ya tiene implementados dos sistemas que son los más habituales en aplicaciones web y en el desarrollo de APIs. Las sesiones son habitualmente los mecanismos para usuarios que se autentican personalmente en la aplicación. Mientras que si se desarrolla un API lo común es usar los "Token".
Generalmente no tendrás que tocar nada, pero se administran desde config/auth.php.
Comando para las migraciones
Estas migraciones están disponibles en el sistema. Al generar el proceso de Login las migraciones se ejecutan, para incorporar al sistema las tablas de usuarios y de reseteos de clave. Recuerda que si tuvieras que ejecutar las migraciones tienes disponible el comando.
php artisan migrate
Deberíamos obtener la siguiente salida:
Migration table created successfully.
Migrated: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_100000_create_password_resets_table
Modificar el formulario de registro para agregar campos
Es una práctica habitual tener un campo "apellidos" ("last_name" llamaremos a este campo) en el formulario de registro, para poder separar el nombre y los apellidos del usuario. A continuación te explicamos los pasos para conseguirlo.
Migraciones:
Por ello podrías hacer una migración para incluir el campo en la tabla de usuarios. Comienzas con el comando:
php artisan make:migration user_apellidos_migration
Luego tienes que generar los cambios deseados en la tabla "users".
public function up()
{
// Creo un campo apellidos "last_name"
Schema::table('users', function($table){
$table->string('last_name', 250);
});
}
public function down()
{
// Elimino el campo last_name
Schema::table('users', function ($table) {
$table->dropColumn('last_name');
});
}
Ejecutamos esta migración con el comando de artisan:
php artisan migrate
Cambiar la vista:
El segundo paso consiste en cambiar la vista del formulario de registro, que encuentras en la ruta: resources/views/auth/register.blade.php
Básicamente agregamos un bloque de formulario para mostrar el campo de texto para los apellidos. Obviamente no solo el campo INPUT, sino con todo lo que hay alrededor para mostrar errores de validación, etc. Quedará más o menos así:
<div class="form-group{{ $errors->has('last_name') ? ' has-error' : '' }}">
<label class="col-md-4 control-label">Last name</label>
<div class="col-md-6">
<input type="text" class="form-control" name="last_name" value="{{ old('last_name') }}">
@if ($errors->has('last_name'))
<span class="help-block">
<strong>{{ $errors->first('last_name') }}</strong>
</span>
@endif
</div>
</div>
Cambiar el controlador:
Nuestro controlador hace también las validaciones y manda los datos del formulario al modelo. Cambiarlo para agregar este nuevo campo es bien sencillo.
Por un lado modificamos el método validator():
protected function validator(array $data)
{
return Validator::make($data, [
'name' => 'required|max:255',
'last_name' => 'required|max:255',
'email' => 'required|email|max:255|unique:users',
'password' => 'required|min:6|confirmed',
]);
}
Luego tenemos el método que invoca al modelo con los datos.
protected function create(array $data)
{
return User::create([
'name' => $data['name'],
'last_name' => $data['last_name'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
]);
}
Cambio en el modelo:
Por último modificamos el modelo para que se pueda rellenar el campo "last_name" desde el método create(), que es el que usa el controlador para guardar la información del usuario.
protected $fillable = [
'name', 'email', 'password', 'last_name'
];
Con esto ya sabes lo básico del sistema de registro y autenticación de usuarios.
Miguel Angel Alvarez
Fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Com...