当前位置: 首页 > 知识库问答 >
问题:

如何检查用户是否在控制器内登录Symfony2?

秦新立
2023-03-14

我在这里读到了如何在一个基于Symfony2的网站的小树枝模板中检查用户的登录状态。但是,我需要知道如何检查用户是否从控制器内部登录。我确信以下代码是正确的:

$user = $this->get('security.context')->getToken()->getUser();

但它总是返回一些信息,例如,登录用户或匿名用户。

有什么想法吗?提前谢谢。

共有3个答案

长孙淳
2023-03-14

试试这个:

if( $this->container->get('security.context')->isGranted('IS_AUTHENTICATED_FULLY') ){
    // authenticated (NON anonymous)
}

进一步资料:

"匿名用户在技术上是经过身份验证的,这意味着匿名用户对象的isAuthentiated()方法将返回true。若要检查您的用户是否确实经过身份验证,请检查IS_AUTHENTICATED_FULLY角色。"

来源:http://symfony.com/doc/current/book/security.html

刘永望
2023-03-14

Symfony 2.6之前,您将使用SecurityContext
SecurityContext将在Symfony 3.0中被弃用,取而代之的是AuthorizationChecker

对于Symfony 2.6

// Get our Security Context Object - [deprecated in 3.0]
$security_context = $this->get('security.context');
# e.g: $security_context->isGranted('ROLE_ADMIN');

// Get our Token (representing the currently logged in user)
$security_token = $security_context->getToken();
# e.g: $security_token->getUser();
# e.g: $security_token->isAuthenticated();
# [Careful]             ^ "Anonymous users are technically authenticated"

// Get our user from that security_token
$user = $security_token->getUser();
# e.g: $user->getEmail(); $user->isSuperAdmin(); $user->hasRole();

// Check for Roles on the $security_context
$isRoleAdmin = $security_context->isGranted('ROLE_ADMIN');
# e.g: (bool) true/false

security.context变为security.authorization\u checker
我们现在从security.token\u存储而不是security.context

// [New 3.0] Get our "authorization_checker" Object
$auth_checker = $this->get('security.authorization_checker');
# e.g: $auth_checker->isGranted('ROLE_ADMIN');

// Get our Token (representing the currently logged in user)
// [New 3.0] Get the `token_storage` object (instead of calling upon `security.context`)
$token = $this->get('security.token_storage')->getToken();
# e.g: $token->getUser();
# e.g: $token->isAuthenticated();
# [Careful]            ^ "Anonymous users are technically authenticated"

// Get our user from that token
$user = $token->getUser();
# e.g (w/ FOSUserBundle): $user->getEmail(); $user->isSuperAdmin(); $user->hasRole();

// [New 3.0] Check for Roles on the $auth_checker
$isRoleAdmin = $auth_checker->isGranted('ROLE_ADMIN');
// e.g: (bool) true/false

在文档中阅读更多信息:授权检查器
如何在twig中执行此操作?:Symfony 2:如何检查用户是否未登录到模板中?

秦凯定
2023-03-14

警告:如果用户使用记住我功能登录,单独检查'IS_AUTHENTICATED_FULLY'将返回false。

根据Symfony 2文档,有3种可能性:

IS_AUTHENTICATED_ANONYMOUSLY-自动分配给处于网站防火墙保护部分但实际上没有登录的用户。这只有在允许匿名访问时才可能。

IS_AUTHENTICATED_Membered-自动分配给通过MemberMe cookie进行身份验证的用户。

是否经过身份验证\u完全自动分配给在当前会话期间提供其登录详细信息的用户。

这些角色代表三种身份验证级别:

如果您有IS\u AUTHENTICATED\u membered角色,那么您也有IS\u AUTHENTICATED\u匿名角色。如果您有IS\u AUTHENTICATED\u FULLY角色,那么您还有另外两个角色。换句话说,这些角色代表了认证“强度”不断增强的三个级别。

我遇到了一个问题,我们系统中使用“记住我”功能的用户被视为根本没有登录到只检查“是否已完全验证”的页面。

答案是,如果他们没有完全验证,则要求他们重新登录,或者检查记住的角色:

$securityContext = $this->container->get('security.authorization_checker');
if ($securityContext->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
    // authenticated REMEMBERED, FULLY will imply REMEMBERED (NON anonymous)
}

我希望,这能让外面的人避免犯我犯的同样的错误。当我查看如何检查某人是否登录Symfony 2时,我将这篇文章作为参考。

资料来源:http://symfony.com/doc/2.3/cookbook/security/remember_me.html#forcing-在访问某些资源之前要重新验证的用户

 类似资料:
  • 我正在构建一个对Azure AD进行OAUTH身份验证的Web应用程序。我的意思是,您通过您的Azure AD/Office e365帐户登录我的应用程序。登录成功后,我将Azure AD用户的GUID与我的Mysql数据库中的用户匹配。我在用户登录的会话信息中设置。 我使用这个howto作为它的基础:https://kv AES . WordPress . com/2016/10/21/azur

  • 问题很简单。我想限制来自不同机器/浏览器的相同登录的用户访问:只有一个实时用户会话是可能的。 库用于用户认证和管理。 当然,这可以使用简单的同步化地图等来完成。但问题是:是否为此制定了特殊机制? 这个问题的另一个变体:如何检索使用< code>apache shiro登录系统的所有主题的列表? UPD: 澄清我的问题。我的愿望是有一些这样的代码(我知道,没有这样的类异常,但这个想法必须更干净):

  • 问题内容: 我正在看这个网站,但似乎无法弄清楚该怎么做,因为它不起作用。我需要检查当前站点用户是否已登录(已验证),并且正在尝试: 尽管确定用户已登录,但它仅返回: 我可以执行其他请求(来自上面url的第一部分),例如: 这将返回成功的响应。 问题答案: Django 1.10+更新:现在是Django 1.10中的属性。为了向后兼容,该方法仍然存在,但在Django 2.0中将被删除。 对于Dj

  • 问题内容: 有什么方法可以让我检查用户打开应用程序时是否登录了iCloud?如果它们尚未登录,并且如果它们已登录到iCloud并曾经使用过该应用程序,那么我希望能够将它们定向到设置页面- 我想跳过登录页面…。 我查看了Apple的iCloud和Cloudkits文档,但找不到任何有帮助的内容!这有可能吗? 问题答案: 在这里,您可以自行说明。有关更多信息,请参阅下面的NSFileManager函数

  • 问题内容: 我正在开发一个网站,要求用户必须登录才能使用该系统。当前功能为:当用户输入用户名和密码时,将在数据库中进行检查以检查该用户是否存在以及是否输入了正确的密码。然后才允许该用户登录。 到现在为止还不错,现在客户端希望向日志记录功能添加更多功能,即客户端只希望该用户存在一个会话。 IE。如果user1是从PC的一个浏览器登录的,则不应允许他从另一个系统或同一PC的另一个浏览器登录。 我怎么做