Hoy vamos a aprender a crear un formulario de login y registro que veremos que lo crea Laravel automáticamente solamente con un comando. También veremos como customizar el formulario añadiendo un nuevo campo y también verificaremos que solamente puedan hacer login los usuarios activos.
Crear sistema de autenticación
Laravel es capaz de generarte todo lo necesario para la autenticación de un proyecto (formularios, clases, rutas, etc.) simplemente con un comando y a partir de ahí podemos personalizarlo todo lo que queramos. Con esto, nos ahorramos muchísimo tiempo, ya que es una tarea que en casi todos los proyectos la tendríamos que hacer.
1 |
php artisan make:auth |
Veremos que se han creado muchos archivos, entre ellos unas vistas. Una de ellas es una layout y lo que voy a hacer va a ser extender las vistas que creamos anteriormente y las extendimos de un layout, cambiarlo por este. El cambio sería este:
1 |
@extends('layouts.app') |
Ahora tiene todo más o menos el mismo estilo, aunque faltarían retocar unas cosas, ya que no estoy utilizando clases de Bootstrap entonces se ve muy pegado a los márgenes. Pero fijándonos en las otras vistas, podemos adaptarlo fácilmente.
Modificar formulario registro
Para añadir un campo al formulario de registro, primero de todo tenemos que crear una migración para que se añada el campo a la tabla de la base de datos. Yo, por ejemplo, he decido poner el campo country, pero podéis poner cualquier cosa.
1 |
php artisan make:migration add_country_field_to_users_table |
Abrimos el archivo y ponemos esto:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class AddCountryFieldToUsersTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::table('users', function(Blueprint $table) { $table->string('country'); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::table('users', function(Blueprint $table) { $table->dropColumn('country'); }); } } |
Ejecutamos la migración:
1 |
php artisan migrate |
Ahora tenemos que añadir el campo al formulario ( resources/views/auth/register.blade.php ), añadimos este código después del bloque de correo:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<div class="form-group{{ $errors->has('country') ? ' has-error' : '' }}"> <label for="country" class="col-md-4 control-label">Country</label> <div class="col-md-6"> <input id="country" type="text" class="form-control" name="country" value="{{ old('country') }}" required> @if ($errors->has('country')) <span class="help-block"> <strong>{{ $errors->first('country') }}</strong> </span> @endif </div> </div> |
Una vez está hecho esto, tenemos que añadirlo al método que lo comprueba y al que lo guarda.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
protected function validator(array $data) { return Validator::make($data, [ 'name' => 'required|string|max:255', 'email' => 'required|string|email|max:255|unique:users', 'country' => 'required|string', 'password' => 'required|string|min:6|confirmed', ]); } // protected function create(array $data) { return User::create([ 'name' => $data['name'], 'email' => $data['email'], 'country' => $data['country'], 'password' => bcrypt($data['password']), ]); } |
Y finalmente, tenemos que indicar en el modelo que se podrá rellenar el campo country:
1 2 3 |
protected $fillable = [ 'name', 'email', 'password', 'country', ]; |
Con esto ya tendremos todo, se guardará en la base de datos al registrarnos y podremos acceder desde el objeto usuario o desde el objeto auth.
1 |
Auth::user()->country |
Comprobar si el usuario que hace login está activo
Si queremos que solamente puedan hacer login usuarios activos, primero de todo tenemos que crear una columna que sea para saber si está activo o no.
1 |
php artisan make:migration add_active_field_to_user_table |
Abrimos el archivo y añadimos:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class AddActiveFieldToUserTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::table('users', function(Blueprint $table) { $table->boolean('active')->default(1); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::table('users', function(Blueprint $table) { $table->dropColumn('active'); }); } } |
Lo ejecutamos:
1 |
php artisan migrate |
Ya tenemos la columna en la base de datos, ahora sólo falta la comprobación que la tenemos que poner en el controlador del login. Añadimos el siguiente código que lo que hará será hacer la comprobación de que el usuario esté activo:
1 2 3 4 5 6 7 8 |
// arriba del archivo use Illuminate\Http\Request; protected function credentials(Request $request) { $request['active'] = 1; return $request->only($this->username(), 'password', 'active'); } |
Ahora cuando vayamos a hacer login con un usuario que su columna active sea 0, nos dará un error. Estas comprobaciones también se podrían aplicar para otro tipo de cosas.
En la siguiente entrada, utilizaremos los middleware para restringir el acceso a alguna página si no estás logueado y explicaremos como crear uno personalizado.
Hola no sé por qué ya no hay comentarios desde hace varias entradas, lo cierto es que no todo me esta saliendo bien, espero que me pueda contestar.
Me marca el siguiente error: «Trait ‘App\Http\Controllers\Auth\Illuminate\Http\Request’ not found»
en use Illuminate\Http\Request; que coloqué en LoginController.php
¿Cómo se corrige?
Gracias
Hola Laura!
Primero muchas gracias por tu comentario!
El error que me comentas lo más seguro es porque has puesto en el lugar incorrecto el
use Illuminate\Http\Request;
.Seguramente lo has puesto dentro de la clase y va fuera de la clase después del
namespace App\Http\Controllers\Auth;
.Recuerda que puedes ver el código de todo en GitHub, te dejo aquí el enlace. También te dejo el enlace al LoginController.php.
Un saludo, espero haberte ayudado!