2012-07-10 64 views
4

我試圖找到一種處理Symfony2中訪問控制的好方法。Symfony2:訪問控制的最佳做法

我的要求:

  • 我的應用程序的90%,只能通過身份驗證的用戶才能訪問
  • 在許多控制器我需要檢查,如果用戶是所有者
  • 也有一些分歧不同的用戶角色

我已經做了:

  • 安裝JMSSecurityExtraBundle通過註解檢查權限
  • 定義的全局ACE對我的實體類
  • 我在創建過程

業主和角色的檢查是創建所有者爲每個對象的王牌沒問題。我只想以全局的方式定義用戶必須經過身份驗證,而例外(可以匿名訪問的站點)我想將其定義爲分隔(最好通過註釋)。 我不想通過路由模式來做到這一點。

回答

0

我不確定這是你在找什麼,但你用Event Listener嘗試?

您可以在onKernelController方法中進行驗證。然後,您可以創建不同的接口並檢查監聽器中控制器的類型。

+1

好主意,但算不上什麼我要找的。我通過在security.yml中設置常規訪問規則解決了這個問題,使用JMSSecurityExtraBundle爲特定控制器註釋以及單個對象的ACL。 – 2012-08-16 15:50:58

+0

@ serious.siriso考慮發佈你的問題的答案! – JeanValjean 2013-01-20 14:26:17

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); 

} 

}

+0

請詳細說明您的答案! – Beppe 2013-09-25 23:19:25