2014-01-27 63 views
0

我搜索了幾個小時,我沒有發現真的如何覆蓋用戶和管理員端的登錄模板。FosUserBundle不同的登錄頁面

心中已經創建了管理員在防火牆security.yml

firewalls: 
    admin: 
     pattern: /admin(.*) 
     form_login: 
     provider: fos_userbundle 
     csrf_provider: form.csrf_provider 
     login_path: /admin/login 
     check_path: /admin/login_check 
     default_target_path: /admin 
     logout: 
     path: /admin/logout 
     target:/
     anonymous: true 

    access_control: 
    - { path: ^/admin/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/admin/logout$, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/admin/login_check$, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/admin, roles: ROLE_ADMIN } 
    - { path: ^/.*, roles: IS_AUTHENTICATED_ANONYMOUSLY } 

現在我想創建一個登錄表單。

據我所知,我們必須創建一個登錄動作(因爲如果我們不symfony2拋出一個路徑未發現異常)。

路由的管理員登錄:

admin_login: 
    pattern: /admin/login 
    defaults: { _controller: CSCommonBundle:Admin/Default:login } 

控制器,用於顯示登錄頁面:

public function loginAction() 
{ 
    return $this->render('CSCommonBundle:Admin/Login:login.html.twig'); 
} 

和登錄表單:

<form class="form-signin" action="/admin/login_check" method="post"> 
    <h2 class="form-signin-heading">Giriş Yapın</h2> 
    <div class="login-wrap"> 
     <input type="text" name="_username" id="username" class="form-control" placeholder="{% trans %}Kullanıcı Adı{% endtrans %}/{% trans %}E-Posta{% endtrans %}" autofocus> 
     <input type="password" name="_password" id="password" class="form-control" placeholder="{% trans %}Şifre{% endtrans %}"> 
     <label class="checkbox"> 
      <input type="checkbox" id="remember_me" name="_remembe_me" value="on"> Beni Hatırla 
     </label> 
     <button class="btn btn-lg btn-login btn-block" type="submit">{% trans %}Giriş Yap{% endtrans %}</button> 
    </div> 
</form> 

現在,我有幾個問題;

  1. 我們如何獲取登錄錯誤?
  2. 正在創建像這樣的登錄表單,與fosuserbundle一起使用?
  3. 我們可以爲其他用戶類型創建另一個登錄頁面嗎?
  4. Giving form/admin/login_check(與security.yml相同)是否健康?

請向我解釋這些。我迷路了,卡在這裏。

回答

2

我強烈建議使用FOSUserBundle文檔來正確執行此操作。呈現您的登錄操作的控制器實際上應該是FOSUserBundle SecurityControlle loginAction。這將從安全角度正確處理日誌記錄,並且還會處理您的登錄錯誤消息。

1.我相信FOSUserBundle使用flash消息來處理登錄錯誤,所以你需要在你的模板中實現它。

2.我會建議查看FOS的文檔,他們精確地展示瞭如何創建一個新的表單來使用,而不是他們的表單。 https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/doc/overriding_templates.md

3.是的,你可以。過去,我通過擴展默認的FOSUserBundle SecurityController並覆蓋renderLogin()方法來完成此操作。 https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Controller/SecurityController.php。這將允許您指定不同的登錄模板。例如,您可以添加一個檢查,以查看該用戶正在走向什麼路線是這樣的:

protected function renderLogin(array $data) { 

    // get target path 
    if ($this->getSession()->get('_security.main.target_path')) { 
     $targetPath = $this->getSession()->get('_security.main.target_path'); 
    } else { 
     $targetPath = $this->get('router')->generate('default_route'); 
    } 

    $template = 'AcmeBundle:Security:loginOne.html.twig'; 

    // if admin 
    if(strstr($targetPath, '/admin') !== false) { 
     $template = 'AcmeBundle:Security:loginTwo.html.twig'; 
    } 

    return $this->container->get('templating')->renderResponse($template, $data); 
} 

我會建議使用一個主窗體和使用的樹枝塊,你可以在所有其他的登錄表單覆蓋,即方式只能改變表單的皮膚而不是整個表單標記本身。如果確實要擴展安全控制器,則可能需要重新創建Resources/config/routing/security.xml中的登錄路由才能使用它。

4.是的,這沒問題,但有這樣的路線。我不會在表單中硬編碼你的login_check路徑,而是創建一個路由並生成它。對客戶端來說,它是相同的網址,但它會更容易維護。檢查的默認FOS路由是'fos_user_security_check'。您還應該在security.yml文件中使用路由,而不是硬編碼路徑。通過這種方式,您只需更改路線即可更改路徑。

這應該允許您在不重新創建整個表單和安全控制器的情況下,對管理員登錄名和前端登錄名使用不同的模板。讓FOS管理安全性,只是擴展和覆蓋你所需要的。

+0

謝謝你的解釋。但有關覆蓋模板的Fos文檔效率不高。你能告訴我一個例子嗎? –

+0

當然,覆蓋模板需要你在應用程序/資源中創建一個新文件,登錄它會是app/Resources/FOSUserBundle/views/Security/login.html.twig。如果你打算使用多個模板,一個用於管理員,另一個用於前端用戶,那麼你不需要重寫默認模板,而是覆蓋安全控制器本身,只需將自己的模板渲染到任何位置即可。注意保持它們使用的相同標記,因爲login_check使用這些輸入名稱。 – joe42

+0

表單元素的名稱是什麼?我很困惑。沒有真正有效的例子。 –