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

내 대답이 도움이 되었다면, 대답의 위쪽 부분에있는 화살표와 체크 표시를 사용하여 upvote하고 수락하십시오. 감사. – Problematic