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.username
与 anon
进行比较是可行的,但这对我来说并不合适。
【问题讨论】:
【参考方案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_ADMIN
、ROLE_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 %
在控制器中执行上述操作
查看以下答案: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:如何检查用户是不是未在模板中登录?的主要内容,如果未能解决你的问题,请参考以下文章