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

时间:2012-04-22 19:55:35

标签: symfony login symfony-security

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

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

但它总会返回一些东西,例如已登录用户或匿名用户。

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

7 个答案:

答案 0 :(得分:145)

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

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

  

IS_AUTHENTICATED_ANONYMOUSLY - 自动分配给用户   在受防火墙保护的网站部分,但实际上并没有   登录。只有在允许匿名访问的情况下才可以使用。

     

IS_AUTHENTICATED_REMEMBERED - 自动分配给用户   通过记住我的cookie验证。

     

IS_AUTHENTICATED_FULLY - 自动分配给拥有的用户   在当前会话期间提供了他们的登录详细信息。

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

  

如果你有IS_AUTHENTICATED_REMEMBERED角色,那么你也有。{p>   IS_AUTHENTICATED_ANONYMOUSLY角色。IS_AUTHENTICATED_FULLY如果你有   'IS_AUTHENTICATED_FULLY'角色,那么您还有另外两个角色。   换句话说,这些角色代表三个级别的增长   认证的“力量”。

我遇到了一个问题,我们系统中使用过“记住我”功能的用户被视为他们在仅检查$securityContext = $this->container->get('security.authorization_checker'); if ($securityContext->isGranted('IS_AUTHENTICATED_REMEMBERED')) { // authenticated REMEMBERED, FULLY will imply REMEMBERED (NON anonymous) } 的网页上根本没有登录。

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

{{1}}

希望这可以帮助那些人犯下同样的错误。在查找如何检查是否有人登录Symfony 2时,我使用这篇文章作为参考。

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

答案 1 :(得分:52)

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');
# 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

Symfony 3.0+(和Symfony 2.6 +)

security.context变为security.authorization_checker 我们现在从security.token_storage而不是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

在文档中阅读更多内容:AuthorizationChecker
如何在树枝上做到这一点?:Symfony 2: How do I check if a user is not logged in inside a template?

答案 2 :(得分:46)

试试这个:

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

更多信息:

  

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

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

答案 3 :(得分:6)

如果您使用SensioFrameworkExtraBundle中的安全注释,则可以使用一些表达式(在\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')

答案 4 :(得分:5)

如果您使用的是角色,则可以查看ROLE_USER 这就是我使用的解决方案:

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

答案 5 :(得分:4)

要添加Anil给出的答案,在 symfony3 中,您可以使用$this->getUser()来确定用户是否已登录,这样的简单条件就像if(!$this->getUser()) {}一样。

如果查看基本控制器中可用的源代码,它会完成Anil定义的完全相同的操作。

答案 6 :(得分:0)

baseController 扩展并实现一些基本函数是一种很好的做法 实现一个函数来检查用户实例是否为空,就像这样 如果用户形成 Userinterface 则没有用户登录

/**

*/
class BaseController extends AbstractController
{

    /**
     * @return User

     */
    protected function getUser(): ?User
    {
        return parent::getUser();
    }

    /**
     * @return bool
     */
    protected function isUserLoggedIn(): bool
    {
        return $this->getUser() instanceof User;
    }
}
相关问题