diff --git a/frontend/middleware/admin-guard.global.ts b/frontend/middleware/admin-guard.global.ts new file mode 100644 index 0000000..e911f74 --- /dev/null +++ b/frontend/middleware/admin-guard.global.ts @@ -0,0 +1,27 @@ +import { useAuthStore } from '~/stores/auth' + +/** + * Garde-fou global : empêche les utilisateurs non-admin d'accéder aux pages + * sous /admin/*. Renvoie vers la home pour les utilisateurs authentifiés + * non-admin, et vers /login pour les non authentifiés. + * + * L'API back rejette de toute façon les actions admin avec un 403, mais ce + * middleware évite l'affichage des pages vides / en erreur quand un user + * tape directement l'URL /admin/... + */ +export default defineNuxtRouteMiddleware(async (to) => { + if (!to.path.startsWith('/admin')) { + return + } + + const auth = useAuthStore() + await auth.ensureSession() + + if (!auth.isAuthenticated) { + return navigateTo('/login') + } + + if (!auth.isAdmin) { + return navigateTo('/') + } +}) diff --git a/src/Entity/Reception.php b/src/Entity/Reception.php index 82d5afc..a6a1c91 100644 --- a/src/Entity/Reception.php +++ b/src/Entity/Reception.php @@ -61,6 +61,7 @@ use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer; ), new Delete( requirements: ['id' => '\d+'], + security: "is_granted('ROLE_ADMIN')", ), new Get( uriTemplate: '/receptions/weigh', diff --git a/src/Entity/Shipment.php b/src/Entity/Shipment.php index d9f9a36..f71e86d 100644 --- a/src/Entity/Shipment.php +++ b/src/Entity/Shipment.php @@ -61,6 +61,7 @@ use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer; ), new Delete( requirements: ['id' => '\d+'], + security: "is_granted('ROLE_ADMIN')", ), new Get( uriTemplate: '/shipments/weigh',