Como configurar el inicio de sesión de Laravel 5.8 con nombre de usuario

Como configurar el inicio de sesión de Laravel 5.8 con nombre de usuario

Laravel incluye un sistema de logueo o inicio de sesión y registro de usuarios bastante avanzado dándonos la posibilidad incluso de activar la verificación de usuarios por correo electrónico y un sistema de recuperación de contraseñas sin práctica mente hacer nada.

Por default este sistema funciona con las columnas email y password que incluso Laravel nos coloca en la migración CreateUsersTable que ya viene al crear nuestro proyecto. Sin embargo, hay ocasiones en las que por x o y necesitamos personalizar un poquito estas columnas, ya sea porque estamos trabajando con una base de datos existente o porque por alguna extraña razón así nos lo requiera el proyecto.

En cualquier caso hoy veremos como podemos personalizar el inicio de sesión de laravel para acceder por medio de un campo personalizado (en este caso el nombre de usuario).

Primer paso

Lo primero es tener un proyecto nuevo (o bien uno existente) de Laravel y haber generado el Authentication scaffolding de Laravel a través del comando php artisan make:auth. Ya que tenemos esto como paso opcional podemos modificar la migración CreateUsersTable para generar la columna username que será la que utilizaremos para iniciar sesión. Si ya tienes esto resuelto te puedes saltar este paso o si por alguna extraña razón no estás usando las migraciones de Laravel (extraño) entonces deberás realizar las modificaciones necesarias a tu base de datos.

Más o menos estamos buscando algo como esto:

Schema::create('users', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('name');
    $table->string('username')->unique();
    $table->string('email')->unique();
    $table->timestamp('email_verified_at')->nullable();
    $table->string('password');
    $table->rememberToken();
    $table->timestamps();
});

Como podemos ver hemos creado la columna username la cual hemos marcado como única para evitar que haya registros con el mismo nombre de usuario. Lo mismo hemos hecho con la columna email.

Segundo paso

Ahora hay que ubicar el archivo app/Http/Controllers/Auth/LoginController.php y crear la siguiente función debajo de todo:

public function username()
{
    return 'username';
}

En caso de que también estés usando el sistema de registro de usuarios que Laravel proporciona también habría que modificar la función validator del controlador RegisterController de tal manera que quede así:

/**
 * Get a validator for an incoming registration request.
 *
 * @param  array  $data
 * @return \Illuminate\Contracts\Validation\Validator
 */
protected function validator(array $data)
{
    return Validator::make($data, [
        'name' => ['required', 'string', 'max:255'],
        'username' => ['required', 'string', 'max:255', 'unique:users'],
        'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
        'password' => ['required', 'string', 'min:8', 'confirmed'],
    ]);
}

En este caso dejamos el límite del nombre de usuario a 255 caracteres, pero si se requiere puede reducirse. Generalmente, las redes sociales lo manejan a un máximo de 16 caracteres.

También no se olviden de agregarlo a los atributos “fillable” del Modelo Users, ya que de otra forma les dará error al registrar un nuevo usuario.

/**
 * The attributes that are mass assignable.
 *
 * @var array
 */
protected $fillable = [
    'name', 'username', 'email', 'password',
];

Tercer paso

Ya por último solo quedaría modificar las vistas de login para poder iniciar sesión por medio del nombre de usuario en lugar del correo electrónico. Para eso tenemos que ubicar el archivo resources/views/auth/login.blade.php y cambiar el input email a text así como su respectiva propiedad name.

<div class="form-group row">
    <label for="username" class="col-md-4 col-form-label text-md-right">{{ __('Username') }}</label>

    <div class="col-md-6">
        <input id="username" type="text" class="form-control @error('username') is-invalid @enderror" name="username" value="{{ old('username') }}" required autocomplete="username" autofocus>

        @error('username')
            <span class="invalid-feedback" role="alert">
                <strong>{{ $message }}</strong>
            </span>
        @enderror
    </div>
</div>

Una vez realizados estos pasos pueden probar a iniciar sesión con su nombre de usuario y verán que podrán hacerlo sin ningún problema.

Espero les sirva esta pequeña guía para cambiar el tipo de acceso de email a nombre de usuario en Laravel.