2013-06-13 12 views
8

Moja aplikacja pokazuje listę projektów, stron szczegółowych projektu i formularzy do edycji tych projektów. Są to trasy:Symfony2: Jak ukryć link w gałązce na podstawie uprawnień

  • /- lista projektów
  • /projekt/42 - widok projektu (strona szczegół projektu)
  • /projekt/42/edit - edycja projektu

Tylko jego właściciel może edytować projekt.

Zaimplementowałam Votera, aby uniemożliwić dostęp do/project/42/edit osobom nie będącym właścicielami.

Teraz chcę również ukryć link "edytuj projekt" na stronie szczegółów projektu. Jaki byłby sposób na zrobienie tego? Idealnie w gałązka, chciałbym zrobić coś takiego

 
{% if may_access(path('project_edit', { 'id': project.id })) %} 
    <a href="{{ path('project_edit', { 'id': project.id }) }}">edit project</a> 
{% endif %} 

mogę wdrożyć tę funkcję jako przedłużenie gałązka, ale być może podobną funkcjonalność już istnieje.

Odpowiedz

10

Funkcja is_granted() faktycznie has a second parameter który pozwala mi robić to, czego potrzebuję:

 
{% if is_granted("MAY_EDIT", project) %} 
    <a href="{{ path('project_edit', { 'id': project.id }) }}">edit project</a> 
{% endif %} 

Używam tego w połączeniu z czekiem w akcji kontrolera:

 
public function editAction(Project $project) 
{ 
    if (!$this->get('security.context')->isGranted('MAY_EDIT', $project)) { 
     $this->flash('You are not allowed to edit this project'); 
     return $this->show($project); 
    } 
    // ... 
} 

To jest faktycznie bardzo podobne do podejścia, które zastosowano w odpowiedzi na nifr na Sonata User - Security on custom field. Miałem nadzieję, że uda mi się znaleźć sposób na automatyczne wywołanie wyborca ​​i uniknięcie połączenia z isGranted().

Jeśli chcesz rzucić okiem na cały kod, to w projekcie samouczka mam published in github.

+2

Należy pamiętać, że każdy może url hack. Upewnij się, że kontroler ma również odpowiednie przekierowania. – Lighthart

+0

Dobra robota. Należy zwrócić uwagę, że jeśli '$ this-> show ($ project);' właśnie zwraca ten sam widok co strona projektu (/ projekt/42). Najlepiej byłoby użyć przekierowania 302 na tę trasę. – Paulpro

+0

Ah, przepraszam, mój $ this-> show ($ project) jest tak naprawdę małym helperem, który zwraca $ this-> redirect ($ this-> generateUrl ('project_show', array ('id' => $ project- > getId()))); – Olav

Powiązane problemy