Guard de navigation

Un guard navigation est une fonction qui permet de contrôler l’accès à une route d’un framework de routage.

Il s’agit d’une fonction qui est exécutée avant qu’une navigation ne se produise, et qui peut décider de bloquer ou d’autoriser la navigation dans l’application.

Exemple d’un guard de navigation avec React en JavaScript

import { useState, useEffect } from 'react';
import { useNavigate, useParams } from 'react-router-dom';

function AuthGuard() {
  const [isLoggedIn, setIsLoggedIn] = useState(false);

  useEffect(() => {
    // Vérifier si l'utilisateur est authentifié.
    const isLoggedIn = localStorage.getItem('token') !== null;

    // Mettre à jour l'état.
    setIsLoggedIn(isLoggedIn);
  }, []);

  const navigate = useNavigate();
  const { id } = useParams();

  // Bloquer la navigation si l'utilisateur n'est pas authentifié.
  if (!isLoggedIn) {
    navigate('/login', { replace: true });
    return null;
  }

  // Autoriser la navigation.
  return <div>Page protégée</div>;
}

Exemple d’un guard de navigation en PHP avec Symfony

// src/Controller/Security/AuthGuard.php

namespace App\Controller\Security;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
use Symfony\Component\Security\Core\Security;

class AuthGuard
{
    private $security;
    private $authorizationChecker;

    public function __construct(Security $security, AuthorizationCheckerInterface $authorizationChecker)
    {
        $this->security = $security;
        $this->authorizationChecker = $authorizationChecker;
    }

    /**
     * @Route("/protected", name="protected")
     */
    public function index(Request $request)
    {
        // Vérifier si l'utilisateur est authentifié.
        if (!$this->security->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
            return $this->redirectToRoute('login');
        }

        // Autoriser la navigation.
        return $this->render('protected.html.twig');
    }

    public function canAccess(Request $request)
    {
        // Vérifier si l'utilisateur a les droits d'accès nécessaires.
        return $this->authorizationChecker->isGranted('ROLE_USER');
    }
}