2011-08-09 88 views
6

本週末我開始學習Symfony 2。我沒有遇到任何問題,因爲我認爲這個框架是有據可查的。FOSUserBundle和ACL業務角色

我對ACL使用FOSUserBundle軟件包。我不知道是否有可能使類似Yii框架:

$bizRule='return Yii::app()->user->id==$params["post"]->authID;'; 
$task=$auth->createTask('updateOwnPost','update a post by author himself',$bizRule); 
$task->addChild('updatePost'); 

您可能會看到上面的代碼段的所有細節。

我怎樣才能達到與Symfony 2類似的東西?這可能嗎?

+0

如果我理解正確,您希望能夠限制對該帖子作者的帖子的編輯/更新?我對Yii不熟悉,所以我有點在黑暗中拍攝。 – Problematic

+0

@Problematic - 確實如此。 Yii ACL方法允許您提供業務規則(如我的問題中的片段所示)。它會自動檢查記錄的用戶標識是否等於從數據庫中選擇的帖子的authID或任何其他列)。你知道Symfony 2中的類似功能嗎? – users1184848

回答

22

Symfony2擁有開箱即用的ACL system。我包括完整起見相關代碼(修改Post,而不是作爲Comment在文檔中):

public function addPostAction() 
{ 
    $post = new Post(); 

    // setup $form, and bind data 
    // ... 

    if ($form->isValid()) { 
     $entityManager = $this->get('doctrine.orm.default_entity_manager'); 
     $entityManager->persist($post); 
     $entityManager->flush(); 

     // creating the ACL 
     $aclProvider = $this->get('security.acl.provider'); 
     $objectIdentity = ObjectIdentity::fromDomainObject($post); 
     $acl = $aclProvider->createAcl($objectIdentity); 

     // retrieving the security identity of the currently logged-in user 
     $securityContext = $this->get('security.context'); 
     $user = $securityContext->getToken()->getUser(); 
     $securityIdentity = UserSecurityIdentity::fromAccount($user); 

     // grant owner access 
     $acl->insertObjectAce($securityIdentity, MaskBuilder::MASK_OWNER); 
     $aclProvider->updateAcl($acl); 
    } 
} 

從本質上講,你給當前登錄後實體的用戶所有權(其中包括編輯權限)。然後檢查當前用戶是否有權編輯:

public function editPostAction(Post $post) 
{ 
    $securityContext = $this->get('security.context'); 

    // check for edit access 
    if (false === $securityContext->isGranted('EDIT', $post)) 
    { 
     throw new AccessDeniedException(); 
    } 

    // retrieve actual post object, and do your editing here 
    // ... 
} 

高度建議您同時通過Access Control ListAdvanced ACL Concepts食譜菜譜更多信息,請閱讀。上面顯示的ACL的實際創建過程非常冗長,我一直致力於緩解疼痛......它是一種工作方式;它的早期測試版本需要大量的愛,所以請自擔風險。

+0

感謝您的回答。現在一切都很清楚。 – users1184848

+4

如果我的回答對您有幫助,請隨時使用答案頂部附近的箭頭和複選標記來上傳並接受它。謝謝。 – Problematic