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');
    }
}
Uso: Protege rutas de gestión de usuarios, patrocinadores y categorías.

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');
    }
}
Uso: Protege rutas de gestión de presentaciones y pósters.

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');
    }
}
Parámetros: Requiere el parámetro {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');
    }
}
Parámetros: Requiere el modelo 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');
    }
}
Uso: Protege la vista pública de detalle de pósters para mostrar solo los publicados.

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();