您好我需要获取路由并查看是否可以访问此路径,在数据库上查看但是级别非常抽象和自动。到目前为止,我正在以这种形式制作:
$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 :(得分:0)
一种方法,如果路由是通用的,请在security.yml中设置ACL,您可以在其中指定例如^ / admin /.*需要ROLE_ADMIN。 如果您有特殊角色,例如,ACCOUNT_ADMIN取决于所选帐户的内容,那么您需要编写自己的VOTER,在那里您可以决定在特定点,权限是否足够。
答案 1 :(得分: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;
}
}
}