Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Symfony][Symfony2] ACL - jak tego używać?
kabanek
post 14.12.2011, 19:35:48
Post #1





Grupa: Zarejestrowani
Postów: 35
Pomógł: 2
Dołączył: 25.06.2009
Skąd: Nowy Sącz

Ostrzeżenie: (0%)
-----


Witam,

piszę projekt w Symfony2 i chciałem użyć ACL, gdyż jest to dlaczego by nie skorzystać ?
Włączyłem acl, napisałem przy dodawaniu taki otoż kod:

  1. if ($form->isValid()) {
  2. $securityContext = $this->get('security.context');
  3. $user = $securityContext->getToken()->getUser(); // get current user
  4.  
  5. $project->setAuthor($user);
  6.  
  7. $entityManager = $this->get('doctrine.orm.default_entity_manager');
  8. $entityManager->persist($project);
  9. $entityManager->flush();
  10.  
  11. // creating the ACL
  12. $aclProvider = $this->get('security.acl.provider');
  13. $objectIdentity = ObjectIdentity::fromDomainObject($project);
  14. $acl = $aclProvider->createAcl($objectIdentity);
  15.  
  16. // retrieving the security identity of the currently logged-in user
  17. $securityIdentity = UserSecurityIdentity::fromAccount($user);
  18.  
  19. // grant owner access
  20. $acl->insertObjectAce($securityIdentity, MaskBuilder::MASK_OWNER);
  21. $aclProvider->updateAcl($acl);
  22.  
  23. $this->get('session')->setFlash('info', $this->tr('Project created'));
  24.  
  25. return $this->redirect($this->generateUrl('projects_list'));
  26. }


i teraz mam pytanie, jak sprawdzić, czy zalogowany użytkownik ma do niego prawa?
Przypuśćmy taką sytuację: mam dwa obiekty klas $user oraz $project. Jak sprawdzić, czy wybrany użytkownik ma prawa do tego obiektu?
To jest raz, dwa: chcę stworzyć grupę użytkowników, którzy mają prawo np dodawać projekty oraz edytować ale tylko te, które sami stworzyli. Można to zrobić za pomocą acl?

Ogólnie chcę zrobić tak: jest użytkownik, który należy do jakiejś grupy. Na początku ten user wraz ze wszystkimi w grupie ma prawo do edycji/usuwania projektów. Następnie pozwala innej grupie np grupie X na to, aby mogli przeglądać zawartość projektu, ale bez edycji. Natomiast grupie Y daję uprawnienia podglądu oraz na przykład dodawania komentarzy.

Można to jakoś ładnie zrobić w acl czy muszę to zrobić za pomocą jakiś dodatkowych obiektów typu grupa?
Go to the top of the page
+Quote Post
paxton
post 20.12.2011, 14:13:57
Post #2





Grupa: Zarejestrowani
Postów: 66
Pomógł: 1
Dołączył: 22.06.2009
Skąd: Londyn, UK

Ostrzeżenie: (0%)
-----


Tutaj masz opisane jak sprawdzać czy zalogowany użytkownik ma prawo do tego obiektu. Oczywiście biorąc pod uwagę ze używasz standardowego providera użytkownika.

http://symfony.com/doc/current/cookbook/se...checking-access

Co do drugiego pytania, nie widzę żadnej różnicy, nie potrzeba robić żadnych grup jeśli tylko indywidualni użytkownicy maja dostęp do obiektu, wiec zastosowanie takie samo.
Go to the top of the page
+Quote Post
kabanek
post 31.05.2012, 20:42:13
Post #3





Grupa: Zarejestrowani
Postów: 35
Pomógł: 2
Dołączył: 25.06.2009
Skąd: Nowy Sącz

Ostrzeżenie: (0%)
-----


witam,

to moje drugie podejście do ACL'a i przyznam, że nie wszystko rozumiem. Chcę wykonać następujące czynności:
1. Tworzenie nowego użytkownika - czy tutaj muszę jakoś zainicjować dla niego obiekt ACL? Coś na wzór:

  1. $securityContext = $this->container->get('security.context');
  2. $securityIdentity = UserSecurityIdentity::fromAccount($user);
  3. $aclProvider->updateAcl($acl);


2. Dodaję nowy projekt, do którego użytkownik ma prawa OWNER'a (w innej akcji), więc zapewne ten kod wchodzi w grę:

  1. // creating the ACL
  2. $aclProvider = $this->get('security.acl.provider');
  3. $objectIdentity = ObjectIdentity::fromDomainObject($project);
  4. $acl = $aclProvider->createAcl($objectIdentity);
  5.  
  6. // retrieving the security identity of the currently logged-in user
  7. $securityContext = $this->get('security.context');
  8. $user = $securityContext->getToken()->getUser();
  9. $securityIdentity = UserSecurityIdentity::fromAccount($user);
  10.  
  11. // grant owner access
  12. $acl->insertObjectAce($securityIdentity, MaskBuilder::MASK_OWNER);
  13. $aclProvider->updateAcl($acl);


3. Dać innemu użytkownikowi prawda do tego projektu, powiedzmy VIEW, czyli

  1. // creating the ACL
  2. $aclProvider = $this->get('security.acl.provider');
  3. $objectIdentity = ObjectIdentity::fromDomainObject($project);
  4. $acl = $aclProvider->createAcl($objectIdentity);
  5.  
  6. // retrieving the security identity of the currently logged-in user
  7. $securityContext = $this->get('security.context');
  8. $user = $securityContext->getToken()->getUser();
  9. $securityIdentity = UserSecurityIdentity::fromAccount($user);
  10.  
  11. // grant owner access
  12. $acl->insertObjectAce($securityIdentity, MaskBuilder::MASK_VIEW);
  13. $aclProvider->updateAcl($acl);


zgadza się? Czy przypadkiem w 3 punkcie zamiast createAcl nie powinno być coś innego?
Samą idee ACL'a rozumiem, tylko nie wiem za bardzo jak z niego korzystać.
Go to the top of the page
+Quote Post
destroyerr
post 1.06.2012, 13:34:08
Post #4





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

Ostrzeżenie: (0%)
-----


Ad. 1. Nie wiek co jest w zmiennej $acl. Generalnie nie musisz tworzyć ACL przy rejestracji. Twój kawałek kodu działa mniej więcej tak, że chcesz sterować dostępem do encji użytkownika.

Ad. 3. Tutaj moim zdaniem powinno być findAcl.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 25.05.2024 - 00:11