27 abril, 2025
Implementar un sistema de roles básico en Laravel desde cero
Implementar un sistema de roles básico en Laravel

Suscríbete a nuestro canal en Youtube
SuscríbirseEn este tutorial te enseñaremos cómo implementar un sistema de roles en un proyecto básico de autenticación en Laravel. Utilizaremos los roles más comunes, como admin y lector, para proteger las rutas y garantizar que solo los usuarios con los permisos adecuados puedan acceder a ciertas secciones de la aplicación.
📝 Tabla de Contenidos:
- Paso 1: Crear el modelo Role, migración y seeder.
- Paso 2: Agregar el campo
role_id
a la tabla de usuarios. - Paso 3: Crear el Middleware
CheckRole
. - Paso 4: Registrar el Middleware en
bootstrap/app.php
. - Paso 5: Asignar un rol a los usuarios al registrarse.
- Paso 6: Proteger las rutas con roles.
- Paso 7: Realizar pruebas.
III.- AGREGAR ROLES
En Laravel, existen varias maneras de agregar roles a los usuarios. Vamos a cubrir tres enfoques principales:
- Role como tipo ENUM en la tabla de usuarios.
- Relación uno a muchos entre
user
yrole
. - Tabla intermedia
userrole
para relaciones muchos a muchos.
En este tutorial, implementaremos la relación uno a muchos entre los modelos User
y Role
, lo que es más sencillo para un sistema de autenticación básico.
Relación entre User
y Role
-
User:
- id
- name
- password
- active
- role_id
belongsTo(Role)
-
Role:
- id
- name
hasMany(User)
🛠 Paso 1: Crear el modelo Role, migración y seeder
Primero, necesitamos crear el modelo Role
con su migración y seeder.
Comandos:
php artisan make:model Role -m
php artisan make:seeder RoleSeeder
Migración (database/migrations/xxxx_xx_xx_create_roles_table.php
):
public function up()
{
Schema::create('roles', function (Blueprint $table) {
$table->id();
$table->string('name'); // Admin, Lector, etc.
$table->timestamps();
});
}
Seeder (database/seeders/RoleSeeder.php
):
public function run()
{
\App\Models\Role::create(['name' => 'admin']);
\App\Models\Role::create(['name' => 'lector']);
}
Ejecuta las migraciones y el seeder:
php artisan migrate
php artisan db:seed --class=RoleSeeder
🛠 Paso 2: Agregar role_id
a users
Ahora, agregamos el campo role_id
a la tabla users
para vincular cada usuario con un rol específico.
Comando:
php artisan make:migration add_role_id_to_users_table --table=users
Migración (database/migrations/xxxx_xx_xx_add_role_id_to_users_table.php
):
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->unsignedBigInteger('role_id')->default(2); // Default to 'lector'
$table->foreign('role_id')->references('id')->on('roles');
});
}
Ejecuta las migraciones:
php artisan migrate
🛠 Paso 3: Crear Middleware CheckRole
El siguiente paso es crear un Middleware que verifique el rol del usuario y permita el acceso solo a los usuarios con el rol adecuado.
Comando:
php artisan make:middleware CheckRole
Middleware (app/Http/Middleware/CheckRole.php
):
public function handle(Request $request, Closure $next, ...$roles)
{
$user = $request->user();
if (!$user || !in_array($user->role->name, $roles)) {
abort(403, 'No autorizado');
}
return $next($request);
}
🛠 Paso 4: Registrar el Middleware en bootstrap/app.php
Para que Laravel reconozca el Middleware, debemos registrarlo en el archivo app/Http/Kernel.php
.
En el archivo Kernel.php
:
protected $routeMiddleware = [
// otros middlewares
'role' => \App\Http\Middleware\CheckRole::class,
];
🛠 Paso 5: Asignar un Rol al Registrar un Usuario
Ahora, cuando un usuario se registre, asignamos un rol automáticamente. Modificamos el método register
en AuthController
.
Modificación en AuthController.php
:
public function register(Request $request)
{
$request->validate([
'name' => 'required',
'email' => 'required|email|unique:users',
'password' => 'required|min:8|confirmed',
]);
// Asignar el rol de 'lector' por defecto
$role = Role::where('name', 'lector')->first();
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password),
'role_id' => $role->id,
]);
Auth::login($user);
return redirect()->intended('dashboard');
}
🛠 Paso 6: Proteger las Rutas con Roles
Finalmente, protegemos las rutas según el rol del usuario. Usamos el Middleware role
.
Ejemplo de rutas protegidas:
Route::get('/admin/dashboard', function () {
return view('admin.dashboard');
})->middleware(['auth', 'role:admin']);
Route::get('/lector/dashboard', function () {
return view('lector.dashboard');
})->middleware(['auth', 'role:lector']);
🛠 Paso 7: Test
Para probar que todo funciona correctamente:
-
Registra un usuario y verifica que se le asigna el rol correcto.
-
Inicia sesión y verifica que, según el rol, se te redirija a la página correspondiente (admin o lector).
-
Intenta acceder a una ruta protegida por rol para asegurar que solo los usuarios con el rol adecuado puedan acceder.
Tutorial de Autenticación Básico en Laravel sin paquetes
- Implementacion de un login básico sin paquetes
- Implementacion de un register básico sin paquetes
- Implementacion de roles sin paquetes
Leido 628 veces | 1 usuarios
Descarga del código fuente Laravel de Implementar un sistema de roles básico en Laravel desde cero
Accede al código fuente esencial de nuestra aplicación en formato ZIP ó TXT. Ideal para desarrolladores que desean personalizar o integrar nuestra solución.
Opciones de descarga
- Usuarios Registrados: Inicia sesión para descarga inmediata.
- Nuevos Usuarios: Regístrate y descarga.