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

Jea*_*ean 73 login symfony symfony-security

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

$user = $this->get('security.context')->getToken()->getUser();
Run Code Online (Sandbox Code Playgroud)

但它总是返回一些东西,例如记录的用户或匿名用户.

任何的想法?提前致谢.

Bry*_*son 149

警告:'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)
}
Run Code Online (Sandbox Code Playgroud)

希望这可以挽救那些人犯下同样的错误.在查找如何检查某人是否已登录Symfony 2时,我使用此帖子作为参考.

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

  • 实际上,您可以使用`$ securityContext-> isGranted('IS_AUTHENTICATED_REMEMBERED')`,因为角色是分层的.因此,使用"IS_AUTHENTICATED_FULLY"意味着用户也具有"IS_AUTHENTICATED_REMEMBERED". (4认同)
  • 对.如果`IS_AUTHENTICATED_FULLY`也保证用户有`IS_AUTHENTICATED_REMEMBERED`,那么你只需要检查`IS_AUTHENTICATED_REMEMBERED`. (4认同)
  • 不对.仅当用户使用"记住我"功能时,IS_AUTHENTICATED_REMEMBERED才返回true.IS_AUTHENTICATED_FULLY确实意味着IS_AUTHENTICATED_REMEMBERED,但不是相反. (3认同)
  • 好点,编辑帖子删除冗余. (2认同)
  • 顺便说一下,使用`$ this-> container-> get('security.authorization_checker')`代替(2.6中的新内容) (2认同)

Ani*_*nil 53

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

  • 从symfony`Controller`里面你可以写`$ this-> isGranted($ role,$ obj,$ errMsg)`.`denyAccessUnlessGranted()`函数和`isGranted()`函数都只是在`security.authorization_checker`服务上调用`isGranted()`的快捷方式. (2认同)

Lor*_*con 46

试试这个:

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

更多的信息:

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

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

  • 顺便说一下,使用`$ this-> container-> get('security.authorization_checker')`代替(2.6中的新内容) (3认同)
  • 好吧..因为Symfony提供了这个解决方案,我建议你使用这个(isGranted).我不认为他们会改变安全组件这样的基本功能的行为.顺便说一句,使用isGranted比简单的字符串比较更专业,更干净. (2认同)

mag*_*tik 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')


小智 6

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

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


Ibr*_*mar 5

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

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