如果用户未经过身份验证,我会尝试将用户重定向到登录页面,但在两种情况下都会重定向工作。这是我的代码:
$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));
}
我哪里错了?感谢)
答案 0 :(得分:2)
在Symfony2中有三级身份验证
IS_AUTHENTICATED_ANONYMOUSLY
IS_AUTHENTICATED_REMEMBERED
IS_AUTHENTICATED_FULLY
如果用户IS_AUTHENTICATED_FULLY
角色还有IS_AUTHENTICATED_REMEMBERED
和IS_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”,则重定向。