2013-01-08 97 views
1

我想使用isGranted('EDIT',$ userObject)允許所有管理員和管理員以及一個用戶編輯給定的用戶數據。Symfony 2 ACL vs Voters

我應該使用ACL進行控制編輯$ userObject嗎? 我寫了額外的選民,檢查登錄的用戶和給定的對象是否相同或用戶是經理或管理員。

在acl中,我必須爲所有管理員,管理員和那個用戶添加ACE for userObject。

建議使用何種方式? 我在Symfony的新..

下面

是選民的代碼:

function vote(TokenInterface $token, $object, array $attributes) 
{ 
    $intersect=array_intersect(array('EDIT','VIEW'), $attributes); 
    if (!empty($intersect)) 
    { 
     //intersect is not empty, it seems to edit or view are in $attributes 
     //voter grants privileges for [user->granted object] 
     //manager->every customer, child-manager 
     //admin->every customer and manager 
     if ($token->getUser()->isAdmin()) 
     { 
      return VoterInterface::ACCESS_GRANTED; 
     } 
     elseif ($token->getUser()->isCustomer()) 
     { 
      //voter not want to think about customer grants, because customer grants currently are held in ACL 
      return VoterInterface::ACCESS_ABSTAIN; 
     } 
     /* @var $object \PSB\StoreBundle\Entity\Customer */ 
     if (is_a($object, '\PSB\StoreBundle\Entity\Customer')) 
     { 

      if ($token->getUser()->isManager()) 
      { 
       //managers also edit customers 
       return VoterInterface::ACCESS_GRANTED; 
      } 
     } 
     elseif (is_a($object, '\PSB\StoreBundle\Entity\Manager')) 
     { 
      /* @var $object \PSB\StoreBundle\Entity\Manager */ 
      if ($token->getUser()->isManager()) 
      { 
       //manager can edit own children 
       if ($token->getUser() == $object->getParent()) 
       { 
        return VoterInterface::ACCESS_GRANTED; 
       } 
      } 
     } 
    } 
    return VoterInterface::ACCESS_ABSTAIN; 
} 

回答

4

當你的模型已經存儲或知道一個動作應該被授予不需要的數據,這真是煩人保持ACL與您的真實數據同步。

所以你應該明顯地實現你自己的選民。

PS:你應該使用的$object instanceof Class代替is_a($object, 'Class')

+0

感謝的instanceof也提示:P 的方式,wchich這樣我可以通過類作爲參數? 使用\ My \ package \ Class; - function_getting_class_param(Class); – borovsky

+0

我知道這是一個古老的,但神聖的善良,它仍然是一個偉大的和相關的答案。 – vpassapera