2013-12-02 3 views
0

Здравствуйте, мне нужно получить маршрут и просмотреть, если у вас есть доступ к этому, просматривая базу данных, но уровень действительно абстрактный и автоматический. К настоящему времени я делаю это на этой форме:Проанализируйте маршрут динамически Symfony2

$accesos = MenuQuery::create() 
      ->useAccesoMenuQuery() 
      ->usePerfilQuery() 
      ->usePerfilUsuarioQuery() 
      ->filterByUsuarioId($this->getUser()->getId()) 
      ->endUse() 
      ->endUse() 
      ->endUse() 
      ->orderBy('menu.orden') 
      ->groupBy('menu.id') 
      ->find(); 
    $permiso = false; 
    foreach ($accesos as $acceso) { 
     if (($acceso->getDireccion() == $ruta) || ($permiso)) { 
      $permiso = true; 
      break; 
     } 
    } 
    return $permiso; 
} 

Я использую эту функцию php для создания этого. Но мне нужно сделать это на брандмауэрах symfony2 или в другой форме, но абстрактно.

ответ

0

Форма, в которой я это делал, использовала прослушиватель событий Symfon2. Здесь я оставляю свой собственный код.

use Symfony\Component\DependencyInjection\ContainerInterface; 
use Symfony\Component\HttpKernel\Event\GetResponseEvent; 
class SoporteListener { 

private $container; 
private $acceso = 0; 

public function __construct(ContainerInterface $container) { 
    $this->container = $container; 
} 

public function onKernelRequest(GetResponseEvent $event) { 
    $request = $this->container->get('request'); 
    $routeName = $request->get('_route'); 
    $securityContext = $this->container->get('security.context'); 
    if (($securityContext->isGranted('ROLE_USUARIO')) && 
      ($routeName != 'done_login') && 
      ($routeName != 'done_logout')) { 
     $usuario = $this->container->get('security.context')->getToken()->getUser(); 
     $permisos = MenuQuery::create() 
       ->useAccesoMenuQuery() 
       ->usePerfilQuery() 
       ->usePerfilUsuarioQuery() 
       ->filterByUsuarioId($usuario->getId()) 
       ->endUse() 
       ->endUse() 
       ->endUse() 
       ->groupBy('menu.id') 
       ->find(); 
     foreach ($permisos as $permiso) { 
      if (($permiso->getDireccion() == $routeName)) { 
       $this->acceso = 1; 
       break; 
      } 
     } 
     if ($this->acceso == 0) { 
      $event->setResponse($this->container->get('templating')->renderResponse('::error.html.twig', array('error' => 'Permiso denegado'))); 
     } else { 
      return;  
     } 
    } else { 
     return; 
    } 
} 

}

0

В одном направлении, и если маршруты являются общими, настройте ACL в security.yml, где вы можете указать, что например ^/admin /.* требует ROLE_ADMIN. Если у вас есть специальные роли, например ACCOUNT_ADMIN, где это зависит от того, что является выбранной учетной записью, тогда вам нужно написать свой собственный VOTER, где вы можете решить, что в определенный момент права достаточны или нет.

Смежные вопросы