<?php
namespace App\Security;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface;
class DynamicAccessVoter implements VoterInterface
{
// Routes everyone has access to
const PUBLIC_ROUTES = [
"login",
"pageNotFound"
];
// Routes everyone who's connected has access to
const PRIVATE_ROUTES = [
"logout",
"homepage",
"edit_password_page",
"edit_password_modal",
"json_get_user_settings",
"json_user_settings_create_save_apprenant",
"json_user_settings_edit_save_apprenant",
"fos_js_routing",
"fos_js_routing_js",
"google_calendar_create_access",
"json_get_commune"
];
// Routes everyone has access to only in dev mode
const DEV_ROUTES = [
"_wdt",
"_profiler",
"_profiler_home",
"_profiler_search",
"_profiler_search_bar",
"_profiler_phpinfo",
"_profiler_search_results",
"_profiler_open_file",
"_profiler_router",
"_profiler_exception",
"_profiler_exception_css",
"_twig_error_test",
"_preview_error"
];
private $env;
/**
* Constructor
*/
public function __construct() {
$this->env = $_SERVER["APP_ENV"];
}
/**
* Custom voter
*
* @param TokenInterface $token
* @param Request $subject
* @param array $env
*/
public function vote($token, $subject, $attributes) {
// Verifie si $subject est une instance de Request
if(!$subject instanceof Request) {
return self::ACCESS_ABSTAIN;
}
$route = $subject->attributes->get("_route");
// Verifie si la route est une route publique (accessible par tout le monde)
if(in_array($route, DynamicAccessVoter::PUBLIC_ROUTES)) {
return self::ACCESS_GRANTED;
}
// Verifie si l'application est en développement et la route nécéssaire pour le debug
if($this->env == "dev" && in_array($route, DynamicAccessVoter::DEV_ROUTES)) {
return self::ACCESS_GRANTED;
}
// Verifie si $utilisateur est une instance de UserInterface
if(!$token->getUser() instanceof UserInterface) {
return self::ACCESS_ABSTAIN;
}
// Verifie si la route est une route accéssible par tout utilisateur connecté
if(in_array($route, DynamicAccessVoter::PRIVATE_ROUTES)) {
return self::ACCESS_GRANTED;
}
// Verifie si l'utilisateur connecté à le droit d'accéder à cette route
if($token->getUser()->hasAccessTo($route)) {
return self::ACCESS_GRANTED;
}
return self::ACCESS_DENIED;
}
}
?>