laravel

Agregar autenticación de usuarios en Laravel – Login y registro

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.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

  • Creo que te falto mencionar el ejemplo de las rutas que tienes que definir en web.php para que pueda funcionar el tutorial, creeria que todos los usuarios que llegan a este post llegan con la misma idea.

    Igualmente te agradezco, ahora necesito saber como funciona lo de los middleware.

Entradas recientes

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

3 días hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

3 días hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

3 días hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

3 días hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

3 días hace

Solución: Apache – Server unable to read htaccess file

Ayer estaba editando unos archivos que son servidos con el servidor Apache y al visitarlos…

4 días hace

Esta web usa cookies.