77

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

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

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

任何的想法?提前致谢。

4

7 回答 7

153

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

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

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

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

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

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

如果你有这个IS_AUTHENTICATED_REMEMBERED角色,那么你也有这个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)
}

希望这可以使人们免于犯我犯的同样错误。在查找如何检查某人是否在 Symfony 2 上登录时,我使用了这篇文章作为参考。

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

于 2012-10-20T01:16:00.970 回答
56

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

在文档中阅读更多内容: 如何在 twig 中执行此操作?:Symfony 2:如何检查用户是否未在模板中登录?AuthorizationChecker

于 2015-08-06T21:34:03.343 回答
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

于 2012-04-22T20:05:21.577 回答
9

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

如果您查看基本控制器中可用的源代码,它的功能与 Anil 定义的完全相同。

于 2017-02-11T08:47:42.947 回答
7

如果您使用 中的安全注释,则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')
于 2016-09-27T08:35:45.180 回答
6

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

if (TRUE === $this->get('security.authorization_checker')->isGranted('ROLE_USER')) {
    // user is logged in
} 
于 2015-03-01T22:08:09.870 回答
1

从 a 扩展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;
    }
}
于 2021-01-15T19:31:54.143 回答