src/Security/DynamicAccessVoter.php line 12

Open in your IDE?
  1. <?php
  2. namespace App\Security;
  3. use Symfony\Component\HttpFoundation\Request;
  4. use Symfony\Component\Security\Core\User\UserInterface;
  5. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  6. use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface;
  7. class DynamicAccessVoter implements VoterInterface
  8. {
  9.     // Routes everyone has access to
  10.     const PUBLIC_ROUTES = [
  11.         "login",
  12.         "pageNotFound"
  13.     ];
  14.     // Routes everyone who's connected has access to
  15.     const PRIVATE_ROUTES = [
  16.         "logout",
  17.         "homepage",
  18.         "edit_password_page",
  19.         "edit_password_modal",
  20.         "json_get_user_settings",
  21.         "json_user_settings_create_save_apprenant",
  22.         "json_user_settings_edit_save_apprenant",
  23.         "fos_js_routing",
  24.         "fos_js_routing_js",
  25.         "google_calendar_create_access",
  26.         "json_get_commune"
  27.     ];
  28.     // Routes everyone has access to only in dev mode
  29.     const DEV_ROUTES = [
  30.         "_wdt",
  31.         "_profiler",
  32.         "_profiler_home",
  33.         "_profiler_search",
  34.         "_profiler_search_bar",
  35.         "_profiler_phpinfo",
  36.         "_profiler_search_results",
  37.         "_profiler_open_file",
  38.         "_profiler_router",
  39.         "_profiler_exception",
  40.         "_profiler_exception_css",
  41.         "_twig_error_test",
  42.         "_preview_error"
  43.     ];
  44.     private $env;
  45.     /**
  46.      * Constructor
  47.      */
  48.     public function __construct() {
  49.         $this->env $_SERVER["APP_ENV"];
  50.     }
  51.     /**
  52.      * Custom voter
  53.      *
  54.      * @param TokenInterface $token
  55.      * @param Request $subject
  56.      * @param array $env
  57.      */
  58.     public function vote($token$subject$attributes) {
  59.         // Verifie si $subject est une instance de Request
  60.         if(!$subject instanceof Request) {
  61.             return self::ACCESS_ABSTAIN;
  62.         }
  63.         $route $subject->attributes->get("_route");
  64.         // Verifie si la route est une route publique (accessible par tout le monde)
  65.         if(in_array($routeDynamicAccessVoter::PUBLIC_ROUTES)) {
  66.             return self::ACCESS_GRANTED;
  67.         }
  68.         // Verifie si l'application est en développement et la route nécéssaire pour le debug
  69.         if($this->env == "dev" && in_array($routeDynamicAccessVoter::DEV_ROUTES)) {
  70.             return self::ACCESS_GRANTED;
  71.         }
  72.         // Verifie si $utilisateur est une instance de UserInterface
  73.         if(!$token->getUser() instanceof UserInterface) {
  74.             return self::ACCESS_ABSTAIN;
  75.         }
  76.         // Verifie si la route est une route accéssible par tout utilisateur connecté
  77.         if(in_array($routeDynamicAccessVoter::PRIVATE_ROUTES)) {
  78.             return self::ACCESS_GRANTED;
  79.         }
  80.         // Verifie si l'utilisateur connecté à le droit d'accéder à cette route
  81.         if($token->getUser()->hasAccessTo($route)) {
  82.             return self::ACCESS_GRANTED;
  83.         }
  84.         return self::ACCESS_DENIED;
  85.     }
  86. }
  87. ?>