2011-08-09 21 views
6

Zacząłem uczyć się Symfony 2 w ten weekend. Nie miałem problemu, ponieważ ramy są dobrze udokumentowane w mojej opinii.FOSUserBundle i ACL Business Rola

Używam pakietu FOSUserBundle dla ACL. Zastanawiam się, czy możliwe jest uczynienie go podobnym do struktury Yii:

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

Możesz zobaczyć wszystkie szczegóły w powyższym fragmencie.

Jak mogę osiągnąć coś podobnego w Symfony 2? czy to możliwe?

+0

Jeśli dobrze rozumiem, chcesz mieć możliwość ograniczenia edycji/aktualizacji wpisu do autora tego wpisu? Nie jestem zaznajomiony z Yii, więc robię zdjęcia w ciemności. – Problematic

+0

@Problematic - Dokładnie. Podejście ACL Yii umożliwia podanie reguły biznesowej (jak pokazano we fragmencie w moim pytaniu). Sprawdza automatycznie, czy logowany identyfikator użytkownika to authID - lub jakakolwiek inna kolumna - wpisu wybranego z bazy danych). Czy wiesz o podobnej funkcjonalności w Symfony 2? – users1184848

Odpowiedz

22

Symfony2 ma ACL system po wyjęciu z pudełka, które to zrobi. Ja w tym odpowiedni kod dla kompletności wywodu (zmodyfikowane dla Post zamiast Comment jak jest w dokumentacji):

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

Zasadniczo dajesz aktualnie zalogowany użytkownik jest właścicielem podmiotu post (który obejmuje uprawnienia do edycji). A następnie sprawdzić, czy bieżący użytkownik ma uprawnienia do edycji:

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 
    // ... 
} 

I wysoce zalecamy przeczytanie obu Access Control List i Advanced ACL Concepts receptury cookbook aby uzyskać więcej informacji. Rzeczywiste tworzenie list ACL, jak pokazano powyżej, jest bardzo szczegółowe, a ja pracowałem nad open-source ACL manager, aby złagodzić ból ... to "rodzaj pracy;" Jest to wczesna wersja beta i wymaga dużo miłości, więc korzystaj z niej na własne ryzyko.

+0

Dzięki za odpowiedź. Teraz wszystko jest dla mnie jasne. – users1184848

+4

Jeśli moja odpowiedź ci pomogła, możesz ją przejąć i zaakceptować, używając strzałek i znacznika wyboru w górnej części odpowiedzi. Dzięki. – Problematic