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

我读了 给你如何检查一个用户的登录状态内的树枝模板为 Symfony2为基础的网站。 但是,我需要知道如何检查用户是否从控制器内部登录。我很确定下面的代码是正确的:

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

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

有什么想法吗? 先谢谢你。

135538 次浏览

试试这个:

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

进一步资料:

”匿名用户在技术上是经过身份验证的,这意味着 匿名用户对象的 isAuthenticated ()方法将返回 true。 若要检查用户是否真正经过身份验证,请检查 是 _ AUTHENTICated _ FULLY 角色

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

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

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

IS _ AUTHENTICated _ ANONYMOUSLY -自动分配给用户 在防火墙保护的网站的一部分,但谁没有实际上 这只有在允许匿名访问的情况下才有可能。

IS _ AUTHENTICATION _ REMEMBERED -自动分配给用户 通过记住我的 cookie 验证。

IS _ AUTHENTICATION _ FULLY -自动分配给具有 在当前会话期间提供了他们的登录详细信息。

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

如果你有 IS_AUTHENTICATED_REMEMBERED的角色,那么你也有 IS_AUTHENTICATED_ANONYMOUSLY的角色。如果你有 IS_AUTHENTICATED_FULLY角色,那么你还有另外两个角色。 换句话说,这些角色代表了三个层次的增长 认证的“强度”。

我遇到了一个问题,我们的系统中使用了“ RememberMe”功能的用户被当作根本没有在只检查 '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

如果使用角色,可以检查 ROLE_USER 这就是我的解决办法:

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

Symfony 3.0中将不推荐使用 SecurityContext

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: 如何检查用户是否在模板中登录?

如果使用来自 SensioFrameworkExtraBundle的安全注释,可以使用一些表达式(在 \Symfony\Component\Security\Core\Authorization\ExpressionLanguageProvider中定义) :

  • @Security("is_authenticated()"): 检查用户是否经过授权而非匿名
  • 检查当前用户是否是匿名用户
  • 相当于 is_granted('IS_AUTHENTICATED_FULLY')
  • 相当于 is_granted('IS_AUTHENTICATED_REMEMBERED')

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

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

baseController扩展并实现一些基本函数是很好的做法 实现一个函数来检查用户实例是否为 null,如下所示 如果用户形成 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;
}
}