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


101

在Symfony 2模板(使用Twig)中,如何有效检查用户是否未登录?

我不想使用ROLE支票。我想要一种简单的方法来检查用户是否未登录。

我知道app.user.usernameanon作品进行比较,但这对我来说并不对。

Answers:


190

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

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

17
请注意,如果要检查用户是否未登录,可以使用:{% if not app.user %}
Mac_Cain13 2013年

44
使用{% if is_granted('IS_AUTHENTICATED_FULLY') %}代替。参见Symfony2 doc:symfony.com/doc/current/book/…。也可用于Silex:silex.sensiolabs.org/doc/providers/…–
Ronan

16
@Ronan {% if is_granted('IS_AUTHENTICATED_FULLY') %}仅在用户在当前会话中已通过身份验证时才返回true。如果用户通过“记住我” cookie进行了验证,它将返回false。{% if app.user %}如果无论用户何时进行身份验证都希望返回true,则使用是正确的。
RayOnAir 2014年

@Ronan无效,因为它导致以下错误:没有为类“ Symfony \ Component \ Security \ Core \ Authentication \ Token \ PreAuthenticatedToken”的令牌找到身份验证提供程序。
哈罗德2014年

{% if app.security.token is null or app.security.token.user == 'anon.' %}这就是我为我工作的方式
Sebastian G. Marinescu

98

尽管当前答案回答了OP的问题,但我想添加更多详细信息。

我了解OP不想检查角色,但是我将其包括在内,以便其他SO用户将来可以从中复制和粘贴。-每次我搜索此内容时,我都会在这里结束!

Symfony Doc资料来源:


检查是否有任何用户登录(与角色无关)

按照回答,您可以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_ADMIN,和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 %}

在控制器内部执行上述操作

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


2
我只是好奇...什么-%}{%-主张?为什么不%}{%
V-Light

11
-删除所有尾随空格,以它的浏览器源源更具可读性。此处的更多信息:twig.sensiolabs.org/doc/templates.html#whitespace-control
Anil

原谅我再次提出这个老问题,但我想我在某处读到了app.user对于匿名用户不会为null,对吗?这是否意味着对app.user的检查还不够?
pzaj '17

@Anil symfony.com/doc/2.8/templating/app_variable.html描述的第二个参数就是app.user这样The value stored in this variable can be a UserInterface object, any other object which implements a __toString() method or even a regular string.。我不记得我在哪里读到app.user返回“ anon”。不幸的是在什么情况下弦。
pzaj

1
@ user1970395文档中的第一行显示为The representation of the current user or null if there is none.,因此它将为null。如果第三方捆绑包的自定义UserInterface实现具有__toString()在匿名时调用的方法,则它可能会返回字符串。
阿尼尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.