4

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

我的要求:

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

我已经做了什么:

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

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

4

2 回答 2

0

我不确定这是否是您要查找的内容,但是您是否尝试过使用Event Listener

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

于 2012-07-31T22:02:20.190 回答
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);

} 

}

于 2013-09-25T22:58:33.933 回答