Symfony 2:如何在模板中检查用户是否未登录?

108
在Symfony 2模板中(使用Twig),如何有效地检查一个用户是否未登录?
我不想使用ROLE检查。我想要一种直截了当的方法来检查用户是否未登录。
我知道将`app.user.username`与`anon`进行比较可以解决,但那样做感觉不太对。
2个回答

200

您可以检查 app.user 是否已设置。

 {% if app.user %}
    # user is logged in
 {% else %}
    # user is not logged in
 {% endif %}

17
请注意,如果您想检查用户是否未登录,可以使用:{% if not app.user %} - Mac_Cain13
45
改用 {% if is_granted('IS_AUTHENTICATED_FULLY') %}。请参阅Symfony2文档:http://symfony.com/doc/current/book/security.html#retrieving-the-user-object。也适用于Silex的:http://silex.sensiolabs.org/doc/providers/security.html#checking-user-roles。 - Ronan
16
如果用户在当前的会话中进行了身份验证,{% if is_granted('IS_AUTHENTICATED_FULLY') %}将返回true。如果用户通过"记住我"的方式进行了身份验证,则它将返回false。如果想要无论用户何时进行身份验证都返回true,使用{% if app.user %}是正确的。 - RayOnAir
@Ronan,这不起作用,因为它会导致以下错误:找不到类“Symfony\Component\Security\Core\Authentication\Token\PreAuthenticatedToken”的身份验证提供程序。 - Harold
{% if app.security.token is null or app.security.token.user == 'anon.' %} 这是我让它对我起作用的方式。 - Sebastian G. Marinescu

103

虽然当前答案回答了OP的问题,但我想添加更多细节。

我知道OP不想检查角色,但我会包含它们,以便其他Stack Overflow用户可以在未来从中复制和粘贴。- 每次我谷歌这个问题,都会到达这里!

Symfony文档来源:


检查任何已登录用户(不考虑角色)

如已回答,您可以使用app.user检查是否有任何用户已登录。

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

检查认证状态

您可以使用is_granted()方法来检查ROLES,(以下是Symfony分配的所有角色,您也可以拥有自己的角色(更多请见下文))。

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

来自文档:

IS_AUTHENTICATED_ANONYMOUSLY - 自动分配给在网站的防火墙保护部分但尚未登录的用户。只有在允许匿名访问时才可能。

IS_AUTHENTICATED_REMEMBERED - 自动分配给通过记住我cookie进行身份验证的用户。

IS_AUTHENTICATED_FULLY - 自动分配给在当前会话期间提供了他们的登录详细信息的用户。


检查角色

你也可以使用is_granted()来检查角色。
假设我们有3个角色(ROLE_SUPER_ADMINROLE_ADMINROLE_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 %}

在控制器中执行上述操作

请查看以下答案:如何在Symfony2控制器内检查用户是否已登录?


2
我只是好奇...-%}{%-代表什么?为什么不用%}{% - V-Light
12
“-”符号会删除所有末尾空格,这样在浏览器源代码中更易读。更多信息请参考:http://twig.sensiolabs.org/doc/templates.html#whitespace-control - Anil
请原谅我再次提出这个老问题,但我记得在某处读到过,对于匿名用户,app.user不会为空,这不是正确的吗?那么这是否意味着检查app.user就不足够了呢? - pzaj
@Anil http://symfony.com/doc/2.8/templating/app_variable.html 中描述的第二个参数是“app.user”,这样写道:“存储在此变量中的值可以是UserInterface对象,任何其他实现__toString()方法甚至是常规字符串的对象。”不幸的是,我不记得在什么情况下阅读过 app.user 返回“anon.”字符串。 - pzaj
1
@user1970395 文档中的第一行写着“当前用户的表示或者如果没有则为null”,因此它将是null。如果第三方bundle的自定义UserInterface实现具有一个__toString()方法,当匿名时会调用该方法并返回一个字符串。 - Anil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接