2011-08-09 2 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

@問題 - 正確です。 Yii ACLのアプローチではビジネスルールを提供できます(私の質問のスニペットに示されています)。ログに記録されたユーザーIDが、データベースから選択された投稿のauthIDまたは他の列と等しいかどうかが自動的にチェックされます。 Symfony 2の同様の機能について知っていますか? – users1184848

答えて

22

Symfony2には、これを行うACL systemがあります。

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

基本的に、あなたは現在(ポストエンティティのユーザー所有権にログイン与えている:私は完全を期すために、関連するコードを含めています(ドキュメントにあるようPost代わりのComment用に変更)これには編集権限が含まれます)。そして、現在のユーザーが編集する権限を持っているかどうかを確認するために:

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の実際の作成は非常に冗長で、私はopen-source ACL managerに取り組み、痛みを緩和しています。それは早期のベータ版であり、多くの愛が必要なので、あなた自身の責任で使用してください。

+0

お返事ありがとうございます。今私にとってはすべてが明確です。 – users1184848

+4

私の答えがあなたを助けてくれたならば、アップボートして、答えの上にある矢印とチェックマークを使ってそれを受け入れてください。ありがとう。 – Problematic