Symfony 2: Como posso verificar se um usuário não está logado em um template?

101

Nos modelos do Symfony 2 (usando Twig), como posso verificar efetivamente se um usuário não está logado?

Eu não quero usar ROLEcheques. Desejo uma forma direta de verificar se um usuário não está conectado.

Estou ciente de que comparar app.user.usernamecom anonobras, mas isso simplesmente não parece certo para mim.

Ferramenta
fonte

Respostas:

190

Você pode verificar se app.user está definido.

 {% if app.user %}
    # user is logged in
 {% else %}
    # user is not logged in
 {% endif %}
Checksum
fonte
17
Observe que se você quiser verificar se o usuário NÃO está logado, você pode usar:{% if not app.user %}
Mac_Cain13
44
Use em seu {% if is_granted('IS_AUTHENTICATED_FULLY') %}lugar. Veja o documento Symfony2: symfony.com/doc/current/book/… . Também disponível para Silex: silex.sensiolabs.org/doc/providers/…
Ronan
16
@Ronan {% if is_granted('IS_AUTHENTICATED_FULLY') %}só retornará verdadeiro se o usuário tiver se autenticado na sessão atual. Ele retornará falso se o usuário for autenticado por meio de um cookie de lembrar de mim. O uso {% if app.user %}está correto, se desejar retornar verdadeiro, independentemente de quando o usuário foi autenticado.
RayOnAir
@Ronan, isso não funciona porque resulta no seguinte erro: Nenhum Provedor de Autenticação encontrado para o token da classe "Symfony \ Component \ Security \ Core \ Authentication \ Token \ PreAuthenticatedToken".
Harold de
{% if app.security.token is null or app.security.token.user == 'anon.' %}foi assim que consegui funcionar para mim
Sebastian G. Marinescu,
98

Embora a resposta atual responda à pergunta do OP, gostaria de acrescentar mais detalhes.

Eu entendo que o OP não deseja verificar as funções, mas estou incluindo-as para que outros usuários do SO possam copiar e colar a partir disso no futuro. - toda vez que eu procuro no Google, acabo aqui!

Fontes Symfony Doc:


Verifique se algum usuário está conectado (independentemente da função)

Conforme respondido, você pode usar app.userpara verificar se algum usuário está logado.

{% if app.user %}
    # user is logged in (any and all users, regardless of ROLE_*)
{% elseif not app.user %}
    # user is not logged in (note the `not` in the `elseif` statement)
{% endif %}

Verificando o status de autenticação

Você pode usar o is_granted()método para verificar ROLES, (Abaixo estão todas as funções atribuídas pelo symfony, você também pode ter suas próprias funções (mais abaixo) )

{% if is_granted('IS_AUTHENTICATED_FULLY') %}
    # This user entered their credentials THIS session
{% elseif is_granted('IS_AUTHENTICATED_REMEMBERED') %}
    # User logged in via a cookie (ie: Auth again before doing sensitive things)
{% elseif is_granted('IS_AUTHENTICATED_ANONYMOUSLY') %}
    # This is a `guest` or anonymous user
{% endif %}

dos documentos:

IS_AUTHENTICATED_ANONYMOUSLY - atribuído automaticamente a um usuário que está em uma parte protegida por firewall do site, mas que não está realmente conectado. Isso só é possível se o acesso anônimo for permitido.

IS_AUTHENTICATED_REMEMBERED - atribuído automaticamente a um usuário que foi autenticado por meio de um cookie de lembrar de mim.

IS_AUTHENTICATED_FULLY - atribuído automaticamente a um usuário que forneceu seus detalhes de login durante a sessão atual.


Verificando funções

Você também pode usar is_granted()para verificar as funções.
Supondo que temos 3 funções ( ROLE_SUPER_ADMIN, ROLE_ADMIN, e ROLE_USER)

{% if is_granted('ROLE_SUPER_ADMIN') -%}
    # You're `ROLE_SUPER_ADMIN`
{% elseif is_granted('ROLE_ADMIN') -%}
    # You're `ROLE_ADMIN`
{% elseif is_granted('ROLE_USER') -%}
    # You're `ROLE_USER`
{% else %}
    # You're a `nobody` ;P
{%- endif %}

Fazendo o acima dentro de um controlador

Veja a seguinte resposta: Como verificar se um usuário está logado no Symfony2 dentro de um controlador?

Anil
fonte
2
Só estou curioso ... o que -%}e {%-representa? por que não %}e {%?
V-Light
11
O -remove todos os espaços em branco à direita para que seja mais legível na fonte de origem do navegador. Mais informações aqui: twig.sensiolabs.org/doc/templates.html#whitespace-control
Anil
Perdoe-me por trazer esta velha questão à vida novamente, mas acho que li em algum lugar que app.user não será nulo para usuários anônimos, não é? Isso não significa que a verificação de app.user não é suficiente?
pzaj de
@Anil symfony.com/doc/2.8/templating/app_variable.html segundo parâmetro descrito é app.user, indo assim The value stored in this variable can be a UserInterface object, any other object which implements a __toString() method or even a regular string.. Não me lembro onde li que app.user retorna "anon". string infelizmente e em que circunstâncias.
pzaj de
1
@ user1970395 A primeira linha lida na documentação The representation of the current user or null if there is none., portanto, será nula. Um pacote de terceiros pode retornar uma string se sua UserInterfaceimplementação customizada tiver um __toString()método que é chamado quando anônimo.
Anil