2012-01-31 24 views
15

Chciałbym wiedzieć, skąd mogę wiedzieć, czy użytkownik jest przyznany, gdy nie jest aktualnym użytkownikiem w gałązce.Uzyskaj ROLĘ użytkownika niezalogowanego TWIG Symfony2

używam tego kodu dla bieżącego użytkownika:

{% if is_granted('ROLE_USER') %} 
    <a href="...">Delete</a> 
{% endif %} 

Ale chciałbym być w stanie zrobić to samo z ohter użytkowników, którzy nie są zalogowani w tej chwili. Dziękuję.

Edytuj: W rzeczywistości myślę, że nie ma bezpośredniego sposobu, aby gałązka testowała rolę użytkownika, który nie jest uwierzytelniony. Więc zrobiłem to bezpośrednio w szablonie twig, przetestuj czy użytkownik jest administratorem, czy nie, a następnie ustaw var. (w moim pytaniu szukałem jak to zrobić na liście użytkowników.)

{% set from_user_is_admin = false %} 
{% for role in from_user.getRoles() %} 
    {% if role == 'ROLE_ADMIN' %}{% set from_user_admin = true %}{% endif %} 
    {% if role == 'ROLE_SUPER_ADMIN' %}{% set from_user_admin = true %}{% endif %} 
{% endfor %} 
{% if from_user_admin == false %}THIS USER IS NOT ADMIN{% endif %} 

Odpowiedz

15

myślę, że byłoby o wiele łatwiejsze, jeśli wdrożony isGranted funkcję w jednostce użytkownika:

Class User implements UserInterface { 
    ... 
    public function isGranted($role) 
    { 
     return in_array($role, $this->getRoles()); 
    } 
} 

Teraz można łatwo sprawdzić za pewnik ról w każdej warstwie aplikacji. W PHP:

$user->isGranted("USER_ADMIN") 

albo w Gałązka:

user.granted("USER_ADMIN") 

Jeśli trzeba sprawdzić rolę dla bieżącego użytkownika, można to zrobić w Gałązka:

app.user.granted("USER_ADMIN") 

Uwaga: zmienna "aplikacja" jest zdefiniowana globalnie.

Uwaga 2: ten kod może wygenerować wyjątek, jeśli korzystasz z niego poza zabezpieczonym obszarem aplikacji, ponieważ app.user będzie miał wartość NULL.

+0

Tak! Dokładnie to zrobiłem po kilku miesiącach nauki symfony2. – Rmannn

+12

To może nie działać, ponieważ istnieje dziedziczenie roli – nick4fake

+2

Zobacz http://stackoverflow.com/a/24323223/877323 jeśli chcesz obsługiwać dziedziczenie roli, a nie tylko rolę "ścisłą" –

9

Można użyć podobnego oświadczenia z powyższym z „nie”:

{% if not is_granted('ROLE_USER') %} 
    <a href="...">Delete</a> 
{% endif %} 

lub użyć innego oświadczenie:

{% if is_granted('ROLE_USER') %} 
    <a href="...">Delete</a> 
{% else %} 
    {# something else for guest user, not logged in #} 
{% endif %} 
+3

Tak wiem, że funtion , ale is_granted testuje bieżącego użytkownika. Rzeczą, którą chciałbym wiedzieć, jest wykonanie tej samej rzeczy z obiektu użytkownika, który nie jest bieżącym użytkownikiem. Edytuję moje pytanie, tak jak to zrobiłem. Dzięki i tak. – Rmannn

+3

@Lenda Nie przeczytałeś pytania – Nanocom

+0

+1 * Doskonała * implementacja! – mate64

4

należy utworzyć albo gałązkę macro lub funkcję gałązka.

Tworzenie macro jest bardzo prosta, przy użyciu kodu:

{% macro admin_status(from_user) %} 
    {% set from_user_is_admin = false %} 
    {% for role in from_user.getRoles() %} 
     {% if role == 'ROLE_ADMIN' %}{% set from_user_admin = true %}{% endif %} 
     {% if role == 'ROLE_SUPER_ADMIN' %}{% set from_user_admin = true %}{% endif %} 
    {% endfor %} 
    {% if from_user_admin == false %}THIS USER IS NOT ADMIN{% endif %} 
{% endmacro %} 

Następnie można go używać w tym samym pliku jako {% _self.admin_status(user) %}. Możesz również przenieść go do osobnego pliku i użyć znacznikatwig, aby uzyskać do niego dostęp.

Tworzenie funkcji gałązki jest lepszym rozwiązaniem, szczegóły można znaleźć na stronie extending twig. Sprowadza się ona do tworzenia regularnych funkcji, które mogą być wywoływane z gałązki, tak jak ten kod staje się możliwe:

{% if user_is_admin(user) %} 

Będziesz też trzeba czytać enabling custom twig extensions.

+0

WOw, Dziękuję bardzo, mogę umieścić ten kod w szablonie gałązki, dołączyć go, a następnie ponownie użyć kodu! – Rmannn

0

zrobiłem to w ten sposób, mają ten fragment w globalnym pliku gałązka, w moim przypadku layout.html.twig

{% set is_admin = false %} 
{% if app.security.token.user.roles is iterable %} 
    {% for role in app.security.token.user.roles %} 
     {% if role == 'ROLE_ADMIN' or role == 'ROLE_SUPER_ADMIN' %} 
      {% set is_admin = true %} 
     {% endif %} 
    {% endfor %} 
{% endif %} 

następnie można używać wszędzie

{% if is_admin %}....{% endif %} 
Powiązane problemy