En esta entrada vamos a ver lo sencillo que es crear un Middleware para roles en Laravel, la idea es proteger las rutas de nuestra aplicación ofreciendo acceso sólo a aquellos usuarios que realmente lo tengan.
En nuestro caso tendremos los roles Root, Admin y Editor. El usuario Root tendrá acceso a todo, el Admin y el Editor sólo a aquellas rutas en las que lo explicitemos. ¿Por qué escribir un Middleware para roles en lugar de utilizar un paquete existente? No siempre desearemos instalar dependencias externas para todo, existen muchas ocasiones en las que las necesidades de nuestros proyectos son mínimas y desarrollar nuestros propios sistemas nos ahorrará tener que ejecutar cientos de líneas de código en cada petición. Rutas con roles para nuestro proyecto Antes de desarrollar nuestro Middleware veamos el aspecto que tendrán nuestras rutas, aquí es donde utilizaremos nuestro Middleware para proteger las rutas que necesitemos.
<?php
use App\Http\Controllers\{
PostController, UserController
};
use Illuminate\Support\Facades\Route;
Route::group(["middleware" => "role:admin,editor"], function () {
Route::get("posts/json", [PostController::class, "json"])->name("posts.json");
Route::resource("posts", PostController::class)->only("index", "create", "store", "destroy");
});
Route::group(["middleware" => "role:admin"], function () {
Route::get("users/json", [UserController::class, "json"])->name("users.json");
Route::resource("users", UserController::class)->only("index", "create", "store", "destroy");
});
En el anterior ejemplo podemos ver claramente de qué trata nuestro Middleware, haciendo uso de role:... podemos definir todos los roles que deseemos separados por coma, de esta forma, todos los usuarios con esos roles podrán acceder a los recursos que definamos en las rutas. Middleware para roles en Laravel Ahora que ya sabemos cómo utilizar nuestro Middleware, veamos su código, para ello primero vamos a crearlo.
php artisan make:middleware Role
Ahora vamos a modificar su código por el siguiente:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class Role
{
/**
* @param Request $request
* @param Closure $next
* @param mixed ...$roles
* @return mixed
*/
public function handle(Request $request, Closure $next, ...$roles)
{
// si no está identificado no le dejamos acceder
if (!auth()->check())
return redirect('login');
// obtenemos el usuario identificado
$user = auth()->user();
// si el usuario es Root le damos acceso a todo
if ($user->isRoot())
return $next($request);
// si no es root y uno de los roles en las rutas es root no le dejamos acceder
if (in_array("root", $roles))
return redirect('dashboard');
// si el usuario es admin le damos acceso, ya no es necesario permisos de root
if($user->isAdmin())
return $next($request);
// en otro caso si el usuario tiene permisos con su rol puede acceder
foreach($roles as $role) {
if($user->role->name === $role)
return $next($request);
}
// si no se cumple ninguna de las condiciones anteriores es que no tiene permisos
return redirect('login');
}
}
Todo el código anterior está explicado, así que es muy sencillo entender su lógica. Lo importante es ver cómo recogemos los roles desde las rutas de nuestra aplicación.
Ahora, para que esto funcione, debemos registrar nuestro Middleware en el Kernel Http, así que abre el archivo app/Http/Kernel.php y añade el siguiente registro al array $routeMiddleware.
<?php
protected $routeMiddleware = [
// ...
'role' => \App\Http\Middleware\Role::class,
];
Para que el ejemplo sea 100% funcional simplemente necesitas añadir los métodos isRoot/isAdmin al modelo User retornando true/false, eso te lo dejo a ti.
Curso Laravel 12
Completo 2026
El único curso 100% actualizado que incluye Laravel 12, Livewire 3, Vue 3, React 19 e Inertia 2. Aprende con proyectos reales y las últimas funcionalidades.
star Incluido en cualquier suscripción