如何检查用户是否在控制器内部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_REMEMBERED
angular色,那么您也具有IS_AUTHENTICATED_ANONYMOUSLY
angular色。 如果你有IS_AUTHENTICATED_FULLY
angular色,那么你也有另外两个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定义的完全相同的事情。