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

Posted

技术标签:

【中文标题】Symfony 2:如何检查用户是不是未在模板中登录?【英文标题】:Symfony 2: How do I check if a user is not logged in inside a template?Symfony 2:如何检查用户是否未在模板中登录? 【发布时间】:2012-03-28 11:31:44 【问题描述】:

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

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

我知道将 app.user.usernameanon 进行比较是可行的,但这对我来说并不合适。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

请注意,如果您想检查用户是否未登录,您可以使用:% if not app.user % 改用% if is_granted('IS_AUTHENTICATED_FULLY') %。请参阅 Symfony2 文档:symfony.com/doc/current/book/…。也可用于 Silex:silex.sensiolabs.org/doc/providers/… @Ronan % if is_granted('IS_AUTHENTICATED_FULLY') % 只会在用户在当前会话中通过身份验证时返回 true。如果用户通过记住我的 cookie 进行身份验证,它将返回 false。使用% if app.user % 是正确的,如果无论用户何时通过身份验证都想返回true。 @Ronan,这不起作用,因为它会导致以下错误:No Authentication Provider found for token of class "Symfony\Component\Security\Core\Authentication\Token\PreAuthenticatedToken"。跨度> % if app.security.token is null or app.security.token.user == 'anon.' % 这就是我让它为我工作的方式【参考方案2】:

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

我了解 OP 不想检查角色,但我将它们包括在内,以便其他 SO 用户将来可以从中复制和粘贴。 - 每次我用谷歌搜索这个,我都会到这里!

Symfony 文档来源:

http://symfony.com/doc/current/book/security.html http://symfony.com/doc/current/cookbook/security/remember_me.html

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

如已回答,您可以使用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 %

在控制器中执行上述操作

查看以下答案:How to check if an user is logged in Symfony2 inside a controller?

【讨论】:

我只是好奇...-%%- 代表什么?为什么不%% - 删除所有尾随空格,使其在浏览器源代码中更具可读性。更多信息在这里:twig.sensiolabs.org/doc/templates.html#whitespace-control 请原谅我再次提出这个老问题,但我想我在某处读到 app.user 不会为匿名用户为空,不是吗?这不是意味着对 app.user 的检查还不够吗? @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”。不幸的是,在什么情况下字符串。 @user1970395 文档中的第一行为The representation of the current user or null if there is none.,因此它将为空。如果自定义的 UserInterface 实现有一个匿名时调用的 __toString() 方法,第三方包可以返回一个字符串。

以上是关于Symfony 2:如何检查用户是不是未在模板中登录?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查请求是不是是 Symfony2 或 Symfony3 中的 POST 或 GET 请求

如何在 symfony2 中从数据库中渲染 Twig 模板

如何判断字符串是不是未在 Bash shell 脚本中定义

symfony 2 在防火墙检查之前在事件监听器中添加角色

symfony2 电子邮件未在命令中发送

Symfony3 onSecurityInteractiveLogin注销并设置flash