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.
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.
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.