En el post de hoy veremos cómo agregar la autentificación de Laravel a un proyecto existente para, más tarde, poder hacer un login o registro.

Si eres como yo y dejas la autenticación al final, este es tu post, pues te enseñaré a agregar la autenticación de usuarios a Laravel de manera simple y siguiendo siempre los patrones del framework.

No importa si haces esto en un proyecto fresco o avanzado, al final será igual de fácil. También veremos cómo administrar los usuarios.

Por cierto, voy a hacer todos los formularios a mano y no usaré ningún starter kit, pero sí usaré todo lo que Laravel proporciona en cuanto a la autenticación de usuarios.

Migrando tabla de usuarios

Por si no has migrado nada anteriormente, este es buen momento para hacerlo con php artisan migrate.

Si realmente no has migrado nada y vas a hacer modificaciones a la tabla de usuarios, entonces modifica la migración de create_users_table para agregar los campos.

En caso de que ya hayas migrado anteriormente (y por lo tanto ya hayas creado la tabla de users como lo hice yo) y quieras agregar campos, crea una nueva migración.

Por ejemplo, a mí me pidieron rol de usuarios entonces hice una nueva migración:

php artisan make:migration agregar_rol_a_usuarios --table=users

Luego migré con: php artisan migrate

Por cierto, mi migración se ve así:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->string("rol");
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn(["rol"]);
        });
    }
};

Creando controlador

Lo que sigue ahora es crear un controlador. Esto es porque en ocasiones el cliente (o sea, la persona que te encarga el trabajo, no el cliente como en la arquitectura cliente-servidor) necesita crear, eliminar y administrar usuarios.

Además, podemos usar este mismo controlador para autentificar al usuario y todo lo demás.

Entonces procedemos a crearlo e indicamos que debe usar al modelo ya existente (User) además de que debe ser de tipo resource y tener requests:

php artisan make:controller UserController --model=User --resource --requests

Ese comando creará un controlador llamado UserController con todos los verbos (create, store, index) además de StoreUserRequest y UpdateUserRequest en donde validaremos los formularios y también vamos a autorizar.

Con eso ya podemos administrar todos los usuarios.

Ejemplo: registrar usuario

No te mostraré todo el CRUD porque ese no es el objetivo de este post, pero te enseñaré un ejemplo para que veas lo fácil que es.

Veamos cómo registrar un usuario a través de un formulario. Primero en el create del controlador devolvemos la vista del formulario:

<?php 
/**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        return view("usuarios.create");
    }

La vista se ve así:

@extends('master')
@section('titulo', 'Crear nuevo usuario')

@section('contenido')
    <section class="section">
        <h1 class="is-size-3">Datos del usuario</h1>
        <form action="{{ route('usuarios.store') }}" method="post">
            @csrf
            <div class="field">
                <label class="label">Nombre</label>
                <div class="control">
                    <input required class="input" type="text" placeholder="Escribe el nombre" name="name">
                </div>
            </div>
            <div class="field">
                <label class="label">Correo</label>
                <div class="control">
                    <input required class="input" type="email" placeholder="Escribe el correo" name="email">
                </div>
            </div>
            <div class="field">
                <label class="label">Contraseña</label>
                <div class="control">
                    <input required class="input" type="password" placeholder="Escribe la contraseña" name="password">
                </div>
            </div>
            <div class="field">
                <label class="label">Confirmar contraseña</label>
                <div class="control">
                    <input required class="input" type="password" placeholder="Vuelve a escribir la contraseña"
                        name="passwordConfirm">
                </div>
            </div>
            <div class="field">
                <label class="label">Rol</label>
                <div class="select">
                    <select name="rol">
                        <option value="personal" selected>Personal</option>
                        <option value="administrador">Administrador</option>
                    </select>
                </div>
            </div>
            <button type="submit" class="button is-success">Guardar</button>
        </form>
        @include('notificacion_general')
    </section>
@endsection

Luego modificamos los fillables de User y permitimos que los campos se puedan llenar desde el formulario:

<?php

namespace App\Models;

// use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array<int, string>
     */
    protected $fillable = [
        'name',
        'email',
        'password',
        "rol",
    ];

    /**
     * The attributes that should be hidden for serialization.
     *
     * @var array<int, string>
     */
    protected $hidden = [
        'password',
        'remember_token',
    ];

    /**
     * The attributes that should be cast.
     *
     * @var array<string, string>
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];
}

Ahora modificamos el StoreUserRequest para autorizar la operación y además indicar las reglas:

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StoreUserRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array<string, mixed>
     */
    public function rules()
    {
        return [
            "name" => "required",
            "email" => "email:rfc",
            "password" => "required",
            "passwordConfirm" => "required|same:password",
            "rol" => "required",
        ];
    }
}

El formulario que diseñamos anteriormente irá a la acción store del controlador de usuarios en caso de cumplir las reglas. Ahí recibimos los datos y almacenamos:

<?php
/**
     * Store a newly created resource in storage.
     *
     * @param  \App\Http\Requests\StoreUserRequest  $request
     * @return \Illuminate\Http\Response
     */
    public function store(StoreUserRequest $request)
    {
        $user = new User($request->input());
        $user->password = Hash::make($request->input("password"));
        $user->saveOrFail();
        return redirect()->back()->with("mensaje", "Usuario registrado correctamente");
    }

Redireccionamos a la página anterior con un mensaje indicando que todo fue ejecutado correctamente, y listo.

Agregar autenticación de usuarios en Laravel

Conclusión

Después de esto ya podemos mostrar los usuarios, editarlos, eliminarlos y también autentificarlos.

Recuerda que puedes crear middlewares por si los usuarios tienen roles y deseas que solo administren ciertas partes del sistema, y también puedes proteger tus rutas para que solo los usuarios autenticados puedan entrar.

Todo esto es gracias al framework Laravel.

Te recomiendo que también le eches un ojo a cómo crear el primer usuario del sistema y a seguir leyendo más sobre Laravel y PHP en mi blog.

Si el post ha sido de tu agrado te invito a que me sigas para saber cuando haya escrito un nuevo post, haya actualizado algún sistema o publicado un nuevo software. Facebook | X | Instagram | Telegram | También estoy a tus órdenes para cualquier contratación en mi página de contacto