Saltar a contenido

Manejo de roles de usuario

Hay muchas formas de otorgar privilegios a un usuario para que tengan distintos roles en una aplicación web; si es una aplicación grande, o con tareas bien definidas que inclusive puede cambiar en el tiempo. Pero hay que tener en mente que no siempre queremos que todos vean toda la información o que alguien puede gestionarlo todo. Por ello, se propone una gestión de roles básica:

  1. Administrador - acceso total (gestión)
  2. Regular - acceso lector (web)

Aunque ahora lo haremos de una manera más rudimentaria, más adelante veremos la manera en la que mejor se hace.

Creando la migración para modificar la tabla de usuarios

Si a la hora de crear la tabla de usuarios no tuviste en cuenta la posibilidad de que hubiera roles, ahora te toca modificar la tabla para añadir este campo. Es por ello que debes crear la migración pertinente:

php artisan make:migration AddRolToUsers
Quedando el fichero:

<? php
// ***
public function up(): void
{
    Schema::table('users', function (Blueprint $table) {
        $table-›enum('rol',["admin","regular"])-›default("regular");
    });
}

public function down() : void
{
    Schema::table('users', function (Blueprint $table) {
        $table-›dropColumn('rol');
    });

}
Y ejecutamos la migración.

Creando el Middleware para la gestión de roles

El siguiente paso, hayamos hecho la migración o no, es añadir la gestión de la aplicación mediante un Middleware que nos permita adaptar nuestro esquema de roles a ella. Es por eso que debemos programar el fichero:

App\Http\Middleware\UserAccessDashboardMiddleware.php
<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Symfony\Component\HttpFoundation\Response;

class UserAccessDashboardMiddleware
{
    public function handle(Request $request, Closure $next): Response
    {
        if(auth()->user()->isAdmin()){
            return $next($request);
        }

        return redirect('/');
    }
}

Y en el modelo de usuario, añadiremos la siguiente función:

App\Models\User.php
 public function isAdmin(): bool{
        return $this->rol == 'admin';
    }

Y para poder usarlo, tocará modificar el fichero web.php, esto es novedad de Laravel 11 ya que antes se debía modificar el kernel.

web.php
<?php

use App\Http\Controllers\ProfileController;
use Illuminate\Support\Facades\Route;

use App\Http\Middleware\UserAccessDashboardMiddleware;

Route::get('/', function () {
    return view('welcome');
});

Route::middleware('auth')->group(function () {
    Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit');
    Route::patch('/profile', [ProfileController::class, 'update'])->name('profile.update');
    Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy');
});

Route::group(['prefix' => 'dashboard', 'middleware' => ['auth', UserAccessDashboardMiddleware::class]], function () {
    Route::resources([
        'post' => App\Http\Controllers\Dashboard\PostController::class,
        'category' => App\Http\Controllers\Dashboard\CategoryController::class,
    ]);
    Route::get('', function () {
        return view('dashboard');
    })->middleware(['auth'])->name('dashboard');
});

require __DIR__.'/auth.php';

Actividades

  • ⚓ AR 728. (RA8 / CE8c CE8d / IC1 / 3p) - Realiza la configuración de roles (lector y admin) en la aplicación de lista de tareas.

  • 🧪 PR 729. (RA8 / CE8c CE8d / IC2 / 5p) - Tu CTO necesita que se empiece a implementar un sistema de roles en el e-commerce, para ello te da una descripción de cada uno de ellos:

    • Usuario. No debe modificar nada ni entrar a la administración.
    • Editor SEO. Puede modificar los productos.
    • Administrador. Puede crear, eliminar y editar los productos.