2012-01-31 41 views
15

Mi piacerebbe sapere come posso sapere se un utente è concesso quando non è l'utente corrente in twig.Ottenere il RUOLO di un utente non connesso TWIG Symfony2

Io uso questo codice per l'utente corrente:

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

ma vorrei essere in grado di fare la stessa cosa con gli utenti Ohter che non vengono registrati in questo momento. Grazie.

Edit: In realtà penso che non c'è un modo diretto con il ramoscello di testare il ruolo di un utente che non è autenticato. Quindi l'ho fatto direttamente nel modello di ramoscello, verificare se un utente è amministratore o meno, quindi impostare var. (nella mia interrogazione ero alla ricerca come fare in un elenco di utenti.)

{% 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 %} 

risposta

15

penso che sarebbe molto più facile se si implementato una funzione isGranted nell'entità Utente:

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

Si può ora comodamente verificare per i ruoli assegnati a ogni livello della vostra applicazione. In PHP:

$user->isGranted("USER_ADMIN") 

O in Twig:

user.granted("USER_ADMIN") 

Se avete bisogno di controllare un ruolo per l'utente corrente, si può fare questo in Twig:

app.user.granted("USER_ADMIN") 

Nota: la variabile "app" è definita globalmente.

Nota 2: questo codice può generare un'eccezione se lo si utilizza al di fuori dell'area protetta della propria app, poiché app.user sarebbe NULL.

+0

Sì! Questo è esattamente ciò che ho fatto dopo diversi mesi di apprendimento di symfony2. – Rmannn

+12

Questo potrebbe non funzionare, in quanto vi è un'ereditarietà dei ruoli – nick4fake

+2

Vedere http://stackoverflow.com/a/24323223/877323 se si desidera gestire l'ereditarietà del ruolo e non solo il ruolo 'strict' –

9

È possibile utilizzare un'istruzione simile al precedente con "non":

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

o utilizzare else:

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

Sì, lo so che funtion , ma is_granted sta testando l'utente corrente. La cosa che vorrei sapere è fare la stessa cosa da un oggetto utente che non è l'utente corrente. Modifico la mia domanda per mettere il modo in cui l'ho fatto. Grazie comunque. – Rmannn

+3

@Lenda Non hai letto la domanda – Nanocom

+0

+1 * Eccellente * implementazione! – mate64

4

Si dovrebbe creare sia un ramoscello macro, o una funzione ramoscello.

Creazione di un macro è molto semplice, utilizzando il codice:

{% 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 %} 

è possibile utilizzare nello stesso file come {% _self.admin_status(user) %}. Puoi anche spostarlo in un file separato e utilizzare il tag import di twig per accedervi.

Creazione di una funzione di ramoscello è un'opzione migliore, per i dettagli vedere extending twig. Si riduce a creare una funzione regolare, che può essere chiamato da ramoscello, quindi il codice come questo diventa possibile:

{% if user_is_admin(user) %} 

Avrete anche bisogno di leggere enabling custom twig extensions.

+0

WOw, Grazie mille, posso inserire quel codice in un modello di ramoscello, includerlo, quindi riutilizzare il codice! – Rmannn

0

ho fatto in questo modo, avere questo frammento di codice nel file ramoscello globale, nel mio caso 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 %} 

allora posso utilizzare ovunque

{% if is_admin %}....{% endif %} 
Problemi correlati