如何检查用户是否在控制器内部loginSymfony2?

我在这里读到了如何通过基于Symfony2的网站的树枝模板来检查用户的login状态。 但是,我需要知道如何检查用户是否从控制器内部login。 我很确定下面的代码是正确的:

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

但它总是返回一些东西,例如login用户或匿名用户。

任何想法? 提前致谢。

警告 :如果用户使用“记住我”functionlogin,单独检查'IS_AUTHENTICATED_FULLY'将返回false。

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

IS_AUTHENTICATED_ANONYMOUSLY – 自动分配给位于站点的防火墙保护部分但尚未实际login的用户。只有在允许匿名访问的情况下才能执行此操作。

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

IS_AUTHENTICATED_FULLY – 自动分配给在当前会话期间提供其login详细信息的用户。

这些angular色代表三个级别的authentication:

如果您具有IS_AUTHENTICATED_REMEMBEREDangular色,那么您也具有IS_AUTHENTICATED_ANONYMOUSLYangular色。 如果你有IS_AUTHENTICATED_FULLYangular色,那么你也有另外两个angular色。 换句话说,这些angular色代表了三个层次,即增加authentication的“强度”。

我遇到了一个问题,那就是我们的系统用户使用“记住我”function的时候,他们根本就没有login到只检查'IS_AUTHENTICATED_FULLY'

那么答案是要求他们在没有完全authentication的情况下重新login,或者检查记住的angular色:

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

希望这会使得我犯了同样的错误。 在查找如何检查某人是否loginSymfony 2时,我使用这个post作为参考。

资料来源: http : //symfony.com/doc/2.3/cookbook/security/remember_me.html#forcing-the-user-to-re-authenticate-before-accessing-certain-resources

SecurityContext将在Symfony 3.0被弃用

Symfony 2.6之前,你可以使用SecurityContext
SecurityContext将在Symfony 3.0中被弃用,以支持AuthorizationChecker

Symfony 2.6+Symfony 3.0使用AuthorizationChecker


Symfony 2.6(及以下)

 // Get our Security Context Object - [deprecated in 3.0] $security_context = $this->get('security.context'); # eg: $security_context->isGranted('ROLE_ADMIN'); // Get our Token (representing the currently logged in user) $security_token = $security_context->getToken(); # eg: $security_token->getUser(); # eg: $security_token->isAuthenticated(); # [Careful] ^ "Anonymous users are technically authenticated" // Get our user from that security_token $user = $security_token->getUser(); # eg: $user->getEmail(); $user->isSuperAdmin(); $user->hasRole(); // Check for Roles on the $security_context $isRoleAdmin = $security_context->isGranted('ROLE_ADMIN'); # eg: (bool) true/false 

Symfony 3.0+(来自Symfony 2.6+)

security.context变成security.authorization_checker
我们现在从security.token_storage获取我们的token,而不是security.context

 // [New 3.0] Get our "authorization_checker" Object $auth_checker = $this->get('security.authorization_checker'); # eg: $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(); # eg: $token->getUser(); # eg: $token->isAuthenticated(); # [Careful] ^ "Anonymous users are technically authenticated" // Get our user from that token $user = $token->getUser(); # eg (w/ FOSUserBundle): $user->getEmail(); $user->isSuperAdmin(); $user->hasRole(); // [New 3.0] Check for Roles on the $auth_checker $isRoleAdmin = $auth_checker->isGranted('ROLE_ADMIN'); // eg: (bool) true/false 

请阅读文档: AuthorizationChecker
Symfony 2:如何检查用户是否没有login模板?

尝试这个:

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

更多信息:

“匿名用户在技术上是通过身份validation的,这意味着匿名用户对象的isAuthenticated()方法将返回true。要检查用户是否经过身份validation,请检查IS_AUTHENTICATED_FULLYangular色。

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

如果您使用SensioFrameworkExtraBundle安全注释,则可以使用一些expression式(在\Symfony\Component\Security\Core\Authorization\ExpressionLanguageProvider ):

  • @Security("is_authenticated()") :检查用户是否是匿名的
  • @Security("is_anonymous()") :检查当前用户是否是匿名用户
  • @Security("is_fully_authenticated()") :相当于is_granted('IS_AUTHENTICATED_FULLY')
  • @Security("is_remember_me()") :相当于is_granted('IS_AUTHENTICATED_REMEMBERED')

如果你使用angular色,你可以检查ROLE_USER是我使用的解决scheme:

 if (TRUE === $this->get('security.authorization_checker')->isGranted('ROLE_USER')) { // user is logged in } 

要添加到Anil给出的答案,在symfony3中 ,可以使用$this->getUser()来确定用户是否已login,像if(!$this->getUser()) {}这样的简单条件将会执行。

如果您查看基本控制器中可用的源代码,它将完成Anil定义的完全相同的事情。