laravel

Laravel: crear primer usuario del sistema

En nuestros proyectos de Laravel podemos agregar la autenticación de usuarios de manera simple usando lo que el framework provee.

Sin embargo siempre hay un pequeño problema y es el de crear el primer usuario del sistema o el primer administrador del sistema, ya que para crearlo necesitamos estar logueados, pero para loguearnos debe existir un usuario.

Hay varias técnicas para crear un primer usuario del software en Laravel con PHP pero hoy te mostraré uno sencillo y a la manera de Laravel.

Crear primer usuario en Laravel

Primero veamos cómo registrar el usuario administrador que será el primero de nuestro sistema pero explicando sin código o comandos, ya que esto puede cambiar entre versiones de Laravel.

Más abajo te enseñaré el ejemplo, pero por si no funciona, lo que tienes que hacer es:

  1. Crear un seeder
  2. Ir a ese seeder y en el método run definir la creación de un modelo, ya sea con el model User o con DB::insert
  3. Modificar database/seeders/DatabaseSeeder y en run llamar a nuestro seeder
  4. Ahora cuando montemos el sistema por primera vez, haremos las migraciones normalmente pero además pasaremos la opción para “alimentar” nuestra base de datos.

De ese modo se van a crear las tablas y además se van a llenar con nuestro primer usuario. Como esto solo se ejecuta una vez, quedará perfecto para crear un usuario solo al instalar el sistema en Laravel.

Ejemplo para crear administrador si no existe en Laravel

Entonces voy a crear mi seeder o alimentador. Para ello ejecuto:

php artisan make:seeder PrimerUsuarioSeeder

Fíjate en que mi Seeder se llama PrimerUsuarioSeeder.php. Ahora dentro de ese archivo modifico su método run para crear un usuario:

<?php

namespace Database\Seeders;

use App\Models\User;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Hash;

class PrimerUsuarioSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */    public function run()
    {
        $contraseña = "123";
        $user = new User([
            "email" => "admin@gmail.com",
            "password" => Hash::make($contraseña),
            "name" => "Administrador",
        ]);
        $user->saveOrFail();
    }
}

Obviamente en este método puedes crear varios usuarios, no solo uno. Y puedes pasarle todas las propiedades que creas pertinentes. Yo solo estoy pasándole el correo, la contraseña (que debe estar hasheada) y el nombre.

Luego vamos a nuestro DatabaseSeeder.php (el alimentador general) e invocamos a nuestro seeder (desde el método run) que creamos anteriormente, así:

<?php

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */    public function run()
    {
        // \App\Models\User::factory(10)->create();
        $this->call([PrimerUsuarioSeeder::class]);
    }
}

Finalmente hacemos las migraciones y pasamos la opción de alimentar las bases de datos. Así:

php artisan migrate --seed

Y en mi caso me dijo:

Nothing to migrate.
Seeding: Database\Seeders\PrimerUsuarioSeeder
Seeded:  Database\Seeders\PrimerUsuarioSeeder (299.95ms)
Database seeding completed successfully.

Revisé mi base de datos y efectivamente se había creado el primer usuario usando Laravel.

Para producción

Entonces cuando lleves tu app a producción simplemente debes instalar el sistema normalmente, configurar la base de datos y migrar además de alimentar, con:

php artisan migrate --seed

Alternativas

La manera más simple de hacer esto es exportar tu base de datos SQL y luego importarla en la computadora del cliente, pero así ya no estás aprovechando ni siguiendo los lineamientos de Laravel.

Otra manera de hacer esto sería (se me ocurre) creando un Middleware general que compruebe si no hay usuarios registrados, y si no hay, que siempre redireccione a la creación del primer usuario del sistema que no debe estar protegido por autenticación.

Por cierto, la desventaja que encuentro en mi método es que la contraseña queda en el código, pero eso se puede cambiar con cada versión y también puedes obligar al usuario a cambiar su contraseña tan pronto inicie sesión.

Para terminar te dejo con más tutoriales de Laravel 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/

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

1 semana hace

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…

2 semanas 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…

2 semanas 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…

2 semanas hace

Errores de Comlink y algunas soluciones

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

2 semanas 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…

2 semanas hace

Esta web usa cookies.