2013-07-27 167 views
0

我想關閉我的整個網站,只有獲得認證的用戶,但我想保留一些公共路線。公共路線將是:Symfony2鎖全部網站與防火牆

/

/新聞

/註冊

所有的吡唑類都被鎖定。 我做了一個防火牆,它看起來像這樣:

firewalls: 
    user_login: 
     pattern: ^/ 
     anonymous: ~ 

    user_area: 
     pattern: ^/ 
     form_login: 
      login_path: _main_index #this is a route to/
     logout: 
      path: _main_logout #this is a route to /logout 
      target: _main_index #this is a route to/
      invalidate_session: false 

access_control: 
    - { path: ^/news, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/registration, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/user-panel, roles: ROLE_ACTIVE_USER } #is this neccessary? 

然後當我登錄到禁區(/用戶面板),它最高審計機關,我需要對自己充分驗證。

我將我的角色存儲在security.yml中,而不是數據庫中。

我希望你能幫助我!非常感謝你!

編輯: 我loginCheckAction看起來像這樣::

 $encodedPassword = $this->get('user.user_service')->generatePasswordHash($user, $request->request->get('_password')); 
     if ($user->getPassword() == $encodedPassword) { 
      $user->setLastLoginOn(new \DateTime()); 
      $this->em->user($rocker); 
      $this->em->flush(); 

      $token = new UsernamePasswordToken($user, $user->getPassword(), 'user_area', array($user->getRoles())); 

      $request->getSession()->set('_security_user_area', serialize($token)); 

      return $this->redirect($this->generateUrl('_user_panel')); 
     } 
+0

爲什麼兩個防火牆有相同的模式?這不會工作 –

+0

我不知道這是如何工作,但如果我刪除user_login部分,該網站甚至不會調用loginCheckAction ... – lordjancso

+0

我已經得到了這個。 user_login需要自動登錄(否則你需要實現UserProviderInterface)。 user_area實際上是關閉站點的防火牆。 – lordjancso

回答

0

首先,主要的問題之一是在同一路線上的多個防火牆。

Symfony使用/ login路徑登錄,/ login_check默認檢查憑證和/註銷以註銷。對我而言,除登錄路線外,所有路線都很好,因爲我想從/路線登錄用戶。

正因爲如此,我不得不實施UserProviderInterface到我UserRepository這樣的:Authenticating Someone with a Custom Entity Provider - Symfony2 documentation

我只是修改了這個對我的方式(我的用戶電子郵件作爲用戶名)。

Logincheck和註銷是自動工作的,因爲我使用默認路由。

對於所有這一切,你必須實現AdvancedUserInterface到Users實體!

1

您需要添加需要身份驗證的包羅萬象的防火牆,這樣的:

- { path: ^/,     roles: ROLE_ACTIVE_USER } 

這將使所有的頁面沒有被明確列爲無需身份驗證(即與IS_AUTHENTICATED_ANONYMOUSLY)無法訪問的情況下可訪問。但是,由於您尚未列出主頁,因此您還需要添加該主頁。

- { path: ^/$,     roles: IS_AUTHENTICATED_ANONYMOUSLY } 

確保把它包羅萬象的項目之上,如Symfony的處理條目從頂部到底部,而當它找到匹配的項停止。

+0

如果我把這個線 ' - {路徑:^/$,角色:IS_AUTHENTICATED_ANONYMOUSLY}' 那麼這行 ' - {路徑:^ /,角色:ROLE_ACTIVE_USER}' 我會得到一個500警報錯誤,我的分析器沒有工作。 – lordjancso

0

你需要讓anonymus令牌

user_area: 
    pattern: ^/ 
    form_login: 
     login_path: _main_index #this is a route to/
    logout: 
     path: _main_logout #this is a route to /logout 
     target: _main_index #this is a route to/
     invalidate_session: false 
    anonymous: ~ 
+0

我做了,但沒有新的...... :( – lordjancso

+0

最新情況然後你去'/新聞'? –

+0

這部分是現在好了,thx到mirk,但我有另一個問題:)檢查我的編輯部分在我的第一帖子。 – lordjancso

0

試試這個。

- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/registration, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/news, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/(css|js), roles: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/(_wdt|_profiler), roles: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/, roles: ROLE_ACTIVE_USER } 

我覺得login_check由symfony的安全系統內部使用,就像註銷。這個空功能應該可以工作。

/** 
* @Route("/login_check", name="login_check") 
*/ 
public function loginCheckAction() 
{ 

} 

如果您想在成功登錄後將用戶重定向到面板路由,則需要實現登錄事件偵聽器。 Symfony文檔How to create an Event Listener

symfony loginlistener的一些資源。

http://www.ens.ro/2012/03/14/symfony2-login-event-listener/

https://gist.github.com/smottt/1075753

+0

這可能是好的,分析器錯誤不再出現!謝謝! 但是! 看看我的主要帖子中的編輯部分。我粘貼了我的loginCheckAction。 當我登錄時,它是我需要完全驗證自己,但如果我在分析器中檢查會話,我可以看到我需要驗證自己的那些數據。 所以看起來我沒有正確認證... – lordjancso

+0

這需要我總是實現UserProviderInterface ...我很困惑... – lordjancso