我读到这里如何通过检查树枝模板内的用户的登录状态为基础的Symfony2的网站。 但是,我需要知道如何检查,如果用户是从控制器内登录。 我很确信下面的代码是正确的:
$user = $this->get('security.context')->getToken()->getUser();
但总有返回值,如登录的用户或匿名用户。
任何的想法? 提前致谢。
我读到这里如何通过检查树枝模板内的用户的登录状态为基础的Symfony2的网站。 但是,我需要知道如何检查,如果用户是从控制器内登录。 我很确信下面的代码是正确的:
$user = $this->get('security.context')->getToken()->getUser();
但总有返回值,如登录的用户或匿名用户。
任何的想法? 提前致谢。
警告 :检查'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
Symfony 3.0
在此之前Symfony 2.6
你可以使用SecurityContext
。
SecurityContext
将被弃用Symfony 3.0
赞成的AuthorizationChecker
。
对于Symfony 2.6+
和Symfony 3.0
使用AuthorizationChecker
。
// 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
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:如何检查,如果用户是不是一个模板内登录?
试试这个:
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
如果您正在使用安全注解从SensioFrameworkExtraBundle
,你可以使用一些表情(中定义的\Symfony\Component\Security\Core\Authorization\ExpressionLanguageProvider
):
@Security("is_authenticated()")
检查用户authed,而不是匿名 @Security("is_anonymous()")
来检查当前用户是匿名用户 @Security("is_fully_authenticated()")
相当于is_granted('IS_AUTHENTICATED_FULLY')
@Security("is_remember_me()")
相当于is_granted('IS_AUTHENTICATED_REMEMBERED')
如果您使用的角色,你可以检查ROLE_USER
这是我使用的解决方案:
if (TRUE === $this->get('security.authorization_checker')->isGranted('ROLE_USER')) {
// user is logged in
}
要添加到回答阿尼尔给出,在symfony3,您可以用$this->getUser()
来确定用户是否登录,一个简单的条件一样if(!$this->getUser()) {}
就行了。
如果你看看源代码,这是基本的控制器可用,它由阿尼尔定义完全相同的事情。