2014-09-29 66 views
0

我嘗試將用戶重定向到登錄頁面(如果他沒有通過身份驗證),但在兩種情況下都重定向工作。這裏是我的代碼:重定向工作不正確

$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)); 

}

我哪裏錯了?謝謝)

回答

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頁面。

+0

感謝您的幫助) – nowiko 2014-09-29 13:01:11

+0

所以如果有任何用戶有'IS_AUTHENTICATED_ANONYMOUSLY'帽子的理由使用它? – nowiko 2014-09-29 14:51:00

+0

它是層次結構的基礎級別。您可以用它來表示諸如'path:^/$,角色:IS_AUTHENTICATED_ANONYMOUSLY'之類的東西,即任何人都可以訪問該路徑。 – FyodorX 2014-09-29 14:54:19

1

您的問題是,所有通過「記住我」功能或完全使用用戶名和密碼進行身份驗證的用戶具有「IS_AUTHENTICATED_ANONYMOUSLY」角色;他們堆疊。所以你的測試總是返回true,並且用戶總是被重定向。

在這種情況下,它可能是更好的周圍做測試的另一種方法 - 改如果用戶有「IS_AUTHENTICATED_FULLY」或「IS_AUTHENTICATED_REMEMBERED」。

看到這個相關答案:https://stackoverflow.com/a/12984413/84649

+0

感謝您的幫助) – nowiko 2014-09-29 12:59:52

2

在Symfony2中有三個級別的認證

  • IS_AUTHENTICATED_ANONYMOUSLY
  • IS_AUTHENTICATED_REMEMBERED
  • IS_AUTHENTICATED_FULLY

的如果用戶有IS_AUTHENTICATED_FULLY角色^ h還有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')); 
} 
+0

這對於通過記住我cookie進行身份驗證的用戶不起作用。 – FyodorX 2014-09-29 12:59:36

+0

感謝您的幫助) – nowiko 2014-09-29 13:00:20

+0

@FyodorX:我會檢查,因爲我不知道你是... – DonCallisto 2014-09-29 13:10:40