动态查看路径Symfony2

时间:2013-12-02 15:16:48

标签: php security url symfony permissions

您好我需要获取路由并查看是否可以访问此路径,在数据库上查看但是级别非常抽象和自动。到目前为止,我正在以这种形式制作:

$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的防火墙或其他形式上进行,但需要抽象。

2 个答案:

答案 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;
    }
}

}