Symfony2:访问控制的最佳实践

时间:2012-07-10 20:07:59

标签: symfony acl

我正在尝试找到一种在Symfony2中处理访问控制的好方法。

我的要求:

  • 我的应用程序的90%只能由经过身份验证的用户访问
  • 在许多控制器中我需要检查用户是否是所有者
  • 不同用户角色也存在一些差异

我已经做过的事情:

  • 安装了JMSSecurityExtraBundle以通过注释检查权限
  • 为我的实体类定义了全局ace
  • 我在创建过程中为每个对象创建了一个ace

检查所有者和角色是没有问题的。我只想以全局方式定义用户必须进行身份验证和异常(可以匿名访问的站点)我想要将它分开(最好通过注释)。 我不想通过路由模式这样做。

2 个答案:

答案 0 :(得分:0)

我不确定这是你在找什么,但是你试过Event Listener吗?

您可以在onKernelController方法中进行验证。然后,您可以创建不同的接口并在侦听器中检查控制器的类型。

答案 1 :(得分:0)

类AceBuilderListener实现了EventSubscriber {

private $container;

public function setContainer($container){
    $his->container = $container;
}

public function getSubscribedEvents()
{
    return array(
            Events::prePersist,
            Events::preUpdate,
            Events::preRemove,
            Events::postPersist,
            Events::postUpdate,
            Events::postRemove,
            Events::loadClassMetadata,
    );
}

public function prePersist(){ echo( get_class($entity) ); }
public function preUpdate(){ echo( get_class($entity) ); }
public function preRemove(){ echo( get_class($entity) ); }
public function postPersist(){ echo( get_class($entity) ); }

public function postUpdate(LifecycleEventArgs $args)
{

    $entity = $args->getEntity();
    $entityManager = $args->getEntityManager();

    echo get_class($entity);
    // perhaps you only want to act on some "Product" entity
    if ($entity instanceof Product | x) {
        // ... do something with the Product
    }
}

public function postRemove(){ die( get_class($entity) ); }

public function loadClassMetadata( LoadClassMetadataEventArgs $args ){ 
    $classMetadata = $args->getClassMetadata();
    $entityManager = $args->getEntityManager();

            $user = $this->container->get('security.context')->getToken()->getUser();

            // you can check here if isGranted();
            // and get the entity from the object $classMetadata  
            $this->container->get('security.context')->isGranted('EDIT', $entity);

} 

}