Middleware Personalizados
El proyecto incluye middleware personalizados para gestionar permisos y control de acceso.
1. IsAdmin
Ubicación: app/Http/Middleware/IsAdmin.php
Verifica que el usuario autenticado tenga el rol de administrador.
Código
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class IsAdmin
{
public function handle(
Request $request,
Closure $next
): Response
{
if ($request->user() &&
$request->user()->role &&
$request->user()->role->name === 'admin') {
return $next($request);
}
return redirect()->route('dashboard')
->with('error', 'No tienes permisos de administrador');
}
}
2. IsAdminSpeaker
Ubicación: app/Http/Middleware/IsAdminSpeaker.php
Verifica que el usuario tenga rol de administrador o ponente.
Código
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class IsAdminSpeaker
{
public function handle(
Request $request,
Closure $next
): Response
{
if ($request->user() &&
$request->user()->role &&
($request->user()->role->name === 'admin' ||
$request->user()->role->name === 'ponente')) {
return $next($request);
}
return redirect()->route('dashboard')
->with('error', 'No tienes permisos para acceder a este recurso');
}
}
3. IsOwnerPosterCreate
Ubicación: app/Http/Middleware/IsOwnerPosterCreate.php
Verifica que el usuario tenga rol de ponente para crear pósters.
Código
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class IsOwnerPosterCreate
{
public function handle(
Request $request,
Closure $next
): Response
{
// Si el usuario es admin, permitir
if ($request->user()->role->name === 'admin') {
return $next($request);
}
// Verificar que sea ponente y coincida con el usuario de la URL
if ($request->user()->role->name === 'ponente' &&
$request->user()->id === $request->route('user')->id) {
return $next($request);
}
return redirect()->route('dashboard.posters')
->with('error', 'Solo los ponentes pueden crear pósters');
}
}
{user} en la ruta para verificar coincidencia.
4. IsOwnerPosterEdit
Ubicación: app/Http/Middleware/IsOwnerPosterEdit.php
Verifica que el usuario sea propietario del póster a editar o sea administrador.
Código
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class IsOwnerPosterEdit
{
public function handle(
Request $request,
Closure $next
): Response
{
$poster = $request->route('poster');
// Si el usuario es admin, permitir
if ($request->user()->role->name === 'admin') {
return $next($request);
}
// Verificar que sea el propietario del póster
if ($request->user()->id === $poster->user_id) {
return $next($request);
}
return redirect()->route('dashboard.posters')
->with('error', 'No tienes permisos para editar este póster');
}
}
Poster con la relación user_id.
5. IsOwnerPresentationCreate
Ubicación: app/Http/Middleware/IsOwnerPresentationCreate.php
Verifica que el usuario tenga rol de ponente para crear presentaciones.
Código
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class IsOwnerPresentationCreate
{
public function handle(
Request $request,
Closure $next
): Response
{
// Si el usuario es admin, permitir
if ($request->user()->role->name === 'admin') {
return $next($request);
}
// Verificar que sea ponente y coincida con el usuario de la URL
if ($request->user()->role->name === 'ponente' &&
$request->user()->id === $request->route('user')->id) {
return $next($request);
}
return redirect()->route('dashboard.presentations')
->with('error', 'Solo los ponentes pueden crear presentaciones');
}
}
6. IsOwnerPresentationEdit
Ubicación: app/Http/Middleware/IsOwnerPresentationEdit.php
Verifica que el usuario sea propietario de la presentación a editar o sea administrador.
Código
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class IsOwnerPresentationEdit
{
public function handle(
Request $request,
Closure $next
): Response
{
$presentation = $request->route('presentation');
// Si el usuario es admin, permitir
if ($request->user()->role->name === 'admin') {
return $next($request);
}
// Verificar que sea el propietario de la presentación
if ($request->user()->id === $presentation->user_id) {
return $next($request);
}
return redirect()->route('dashboard.presentations')
->with('error', 'No tienes permisos para editar esta presentación');
}
}
7. IsPublishedPosterShow
Ubicación: app/Http/Middleware/IsPublishedPosterShow.php
Verifica que el póster esté publicado antes de mostrarlo públicamente.
Código
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class IsPublishedPosterShow
{
public function handle(
Request $request,
Closure $next
): Response
{
$poster = $request->route('poster');
if ($poster->published) {
return $next($request);
}
return redirect()->route('posters.public')
->with('error', 'Este póster no está disponible');
}
}
Registro de Middleware
Los middleware se registran en bootstrap/app.php:
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/../routes/web.php',
auth: __DIR__.'/../routes/auth.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
)
->withMiddleware(function (Middleware $middleware) {
$middleware->alias([
'admin' => \App\Http\Middleware\IsAdmin::class,
'admin-speaker' => \App\Http\Middleware\IsAdminSpeaker::class,
'owner-poster-create' => \App\Http\Middleware\IsOwnerPosterCreate::class,
'owner-poster-edit' => \App\Http\Middleware\IsOwnerPosterEdit::class,
'owner-presentation-create' => \App\Http\Middleware\IsOwnerPresentationCreate::class,
'owner-presentation-edit' => \App\Http\Middleware\IsOwnerPresentationEdit::class,
'published-poster-show' => \App\Http\Middleware\IsPublishedPosterShow::class,
]);
})
->create();