Documentation Index
Fetch the complete documentation index at: https://mintlify.com/amarcano568/pensionalamedida/llms.txt
Use this file to discover all available pages before exploring further.
Pensión a la Medida delega toda la gestión de permisos y roles en el paquete Spatie Laravel Permission. Cada módulo funcional del panel está protegido por un permiso con nombre, que se verifica a través del middleware permission de Spatie en los grupos de rutas definidos en routes/web.php. El modelo App\User incorpora el trait HasRoles, lo que permite asignar roles, verificar permisos y aplicar scopes directamente sobre cualquier instancia de usuario autenticado.
Todas las rutas de routes/web.php están envueltas en el grupo ['middleware' => 'auth']. El middleware de permisos (permission:nombre_permiso) se aplica como segunda capa, dentro de ese grupo. Por tanto, un usuario debe estar autenticado y poseer el permiso requerido para acceder a la ruta protegida.
Permisos disponibles
Los cuatro permisos activos en el sistema corresponden a los módulos principales del panel de administración. Cada uno protege la ruta GET de entrada al módulo; las rutas POST de operaciones CRUD dentro del mismo módulo no llevan middleware de permiso propio (confían en que el usuario ya superó la verificación de acceso al módulo).
| Nombre del permiso | Ruta protegida | Descripción |
|---|
gestion_alumnos | GET /gestionar-estudiantes | Acceso al módulo de gestión de estudiantes |
gestion_grupos_familiares | GET /gestionar-grupos-familiares | Acceso al módulo de grupos familiares |
gestion_residencia | GET /gestion-residencia | Acceso al módulo de residencia y habitaciones |
gestion_roles | GET /gestion-roles | Acceso al módulo de administración de roles |
Asignar permisos a un rol
Usa Artisan Tinker o un seeder para crear roles y asociarles permisos. El siguiente ejemplo crea un rol Gestor con acceso a los módulos de alumnos y residencia:
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;
$role = Role::create(['name' => 'Gestor']);
$role->givePermissionTo('gestion_alumnos');
$role->givePermissionTo('gestion_residencia');
También puedes pasar un array para asignar múltiples permisos en una sola llamada:
$role->givePermissionTo([
'gestion_alumnos',
'gestion_grupos_familiares',
'gestion_residencia',
'gestion_roles',
]);
Asignar rol a un usuario
Una vez que el rol existe en la base de datos, asígnalo a un usuario con assignRole():
$user = App\User::find(1);
$user->assignRole('Administrator');
Para sustituir el rol de un usuario (eliminar el actual y asignar uno nuevo), el modelo App\Usuario::Guardar() ya implementa este patrón internamente:
$roles = $usuario->getRoleNames();
$usuario->removeRole($roles[0]);
$usuario->assignRole($request->rol);
Verificar permisos en el código
En un controlador
Usa el helper can() sobre el usuario autenticado para proteger lógica condicional:
if (auth()->user()->can('gestion_alumnos')) {
// El usuario tiene permiso para gestionar alumnos
}
También puedes usar la directiva authorize() de Laravel, que lanza una excepción AuthorizationException si el permiso no está presente:
$this->authorize('gestion_alumnos');
En una vista Blade
Usa la directiva @can para mostrar u ocultar elementos de la interfaz según el permiso del usuario autenticado:
@can('gestion_alumnos')
<a href="/gestionar-estudiantes">Gestionar Alumnos</a>
@endcan
@can('gestion_grupos_familiares')
<a href="/gestionar-grupos-familiares">Grupos Familiares</a>
@endcan
@can('gestion_residencia')
<a href="/gestion-residencia">Residencia</a>
@endcan
@can('gestion_roles')
<a href="/gestion-roles">Administrar Roles</a>
@endcan
Middleware de rutas
En routes/web.php, los módulos protegidos agrupan sus rutas de entrada en un Route::group que declara el middleware permission de Spatie. La sintaxis es:
Route::group(['middleware' => ['permission:nombre_permiso']], function () {
Route::get('ruta-del-modulo', 'Controlador@metodo')->name('...');
});
Ejemplos reales del proyecto:
// Módulo de alumnos
Route::group(['middleware' => ['permission:gestion_alumnos']], function () {
Route::get('gestionar-estudiantes', 'AlumnosController@gestionarEstudiantes')
->name('gestion-estudiantes.gestionarEstudiantes');
});
// Módulo de grupos familiares
Route::group(['middleware' => ['permission:gestion_grupos_familiares']], function () {
Route::get('gestionar-grupos-familiares', 'GruposFamiliaresController@gestionarGrupoFamiliar')
->name('gestion-grupos-familiares.gestionarGrupoFamiliar');
});
// Módulo de residencia
Route::group(['middleware' => ['permission:gestion_residencia']], function () {
Route::get('gestion-residencia', 'ResidenciaController@gestionResidencia')
->name('gestion-residencia.gestionResidencia');
});
// Módulo de roles
Route::group(['middleware' => ['permission:gestion_roles']], function () {
Route::get('gestion-roles', 'MantenimientoRolesController@gestionRoles')
->name('gestion-roles.gestionRoles');
});
Cuando un usuario autenticado intenta acceder a una de estas rutas sin el permiso necesario, Spatie lanza una excepción Spatie\Permission\Exceptions\UnauthorizedException (HTTP 403).
Limpiar caché de permisos
Spatie Laravel Permission almacena en caché los permisos y roles para mejorar el rendimiento. Después de cualquier modificación en roles o permisos (alta, baja, asignación), limpia la caché con:
php artisan permission:cache-reset
Este comando es especialmente importante en entornos de producción donde se hayan realizado cambios mediante seeders o Tinker sin reiniciar la aplicación.
El modelo App\Roles en app/Roles.php es un wrapper ligero sobre la tabla roles de Spatie. Se usa únicamente en las vistas de administración del módulo gestion_roles para listar los roles disponibles. Para cualquier operación de creación, edición o asignación de permisos, usa directamente Spatie\Permission\Models\Role, que ofrece todos los métodos del paquete (givePermissionTo, revokePermissionTo, syncPermissions, etc.).