重定向工作不正确

时间:2014-09-29 12:39:10

标签: security symfony redirect

如果用户未经过身份验证,我会尝试将用户重定向到登录页面,但在两种情况下都会重定向工作。这是我的代码:

 $securityContext = $this->get('security.context');

if ($securityContext->isGranted('IS_AUTHENTICATED_ANONYMOUSLY')) {

   return $this->redirect($this->generateUrl('fos_user_security_login'));

} else {

$currentUser = $securityContext->getToken()->getUser()->getProfile()->getId();
$pathToImages = $this->get('kernel')->getRootDir().'/../web';
$userCars = $this->getDoctrine()->getRepository('VputiUserBundle:Car')
                 ->findBy(array('profile' => $currentUser));

 return $this->render('VputiUserBundle:Car:index.html.twig', 
                array('userCars' =>$userCars,
                     'pathToImages' => $pathToImages));

}

我哪里错了?感谢)

3 个答案:

答案 0 :(得分:2)

在Symfony2中有三级身份验证

  • IS_AUTHENTICATED_ANONYMOUSLY
  • IS_AUTHENTICATED_REMEMBERED
  • IS_AUTHENTICATED_FULLY

如果用户IS_AUTHENTICATED_FULLY角色还有IS_AUTHENTICATED_REMEMBEREDIS_AUTHENTICATED_ANONYMOUSLY 如果用户IS_AUTHENTICATED_REMEMBERED角色也有IS_AUTHENTICATED_ANONYMOUSLY

因此,每次检查时,您都会通过该控件。尝试"反转"逻辑:检查IS_AUTHENTICATED_FULLY并呈现页面,否则重定向

您案件的工作代码

$securityContext = $this->get('security.context');

if ($securityContext->isGranted('IS_AUTHENTICATED_FULLY')) {
    $currentUser = $securityContext->getToken()->getUser()->getProfile()->getId();
    $pathToImages = $this->get('kernel')->getRootDir().'/../web';
    $userCars = $this->getDoctrine()->getRepository('VputiUserBundle:Car')
                       ->findBy(array('profile' => $currentUser));

    return $this->render('VputiUserBundle:Car:index.html.twig', 
                    array('userCars' =>$userCars,
                          'pathToImages' => $pathToImages));
} else {
    return $this->redirect($this->generateUrl('fos_user_security_login'));
}

答案 1 :(得分:2)

每个用户都被授予IS_AUTHENTICATED_ANONYMOUSLY,因此始终会解析为true。你想要的是检查用户是否被授予IS_AUTHENTICATED_REMEMBERED,如下所示:

if ( ! $securityContext->isGranted('IS_AUTHENTICATED_REMEMBERED')) {

   return $this->redirect($this->generateUrl('fos_user_security_login'));

} else {
   ...
}

我建议您阅读this fantastic answer about roles以获取更多信息。

无论如何,在这种情况下你不需要这样做。默认情况下,当您将某人发送到防火墙后面的页面时,如果他们未经过身份验证,则会自动将其重定向到login页面。

答案 2 :(得分:1)

您的问题是,通过“记住我”功能或完全使用用户名和密码进行身份验证的所有用户都具有“IS_AUTHENTICATED_ANONYMOUSLY”角色;他们堆叠。因此,您的测试始终返回true,并始终重定向用户。

在这种情况下,最好以相反的方式进行测试 - 如果用户没有具有“IS_AUTHENTICATED_FULLY”或“IS_AUTHENTICATED_REMEMBERED”,则重定向。

请参阅此相关答案:https://stackoverflow.com/a/12984413/84649