2015-05-22 4 views
0

Я хочу иметь два разных (по разному, я имею в виду шаблон) форм, которые могут входить в систему с моим пользователем на разных веточках. Но я получаю сообщение об ошибке из одной из моих форм ... Это то, что я сделал шаг за шагом:Symfony2 FOSUser/SonataBundle недействительное значение токена CSRF

У меня есть основной шаблон для входа на маршрут /login. Этот логин работает!.

Чтобы сделать второй вид работы в /product_frm я это сделал:

1) Создан маршрут для второго контроллера входа в систему. Так что теперь у меня есть два входа маршрута:

login: 
    path: /login 
    defaults: { _controller: ApplicationSonataUserBundle:SecurityFOSUser1:login } 

loginForm: 
    path: /login_frm 
    defaults: { _controller: ApplicationSonataUserBundle:LoginFormType:login } 

Теперь это контроллер для /login_frmкоторый идентичен контроллеру /login, только тонированное шаблон отличается:

<?php 
/* 
* This file is part of the Sonata package. 
* 
* (c) Thomas Rabaix <[email protected]> 
* 
* For the full copyright and license information, please view the LICENSE 
* file that was distributed with this source code. 
*/ 


namespace Application\Sonata\UserBundle\Controller; 

use FOS\UserBundle\Controller\SecurityController; 
use Sonata\UserBundle\Model\UserInterface; 
use Symfony\Component\HttpFoundation\RedirectResponse; 

use Sonata\UserBundle\Controller\SecurityFOSUser1Controller as BaseController; 


class LoginFormTypeController extends BaseController 
{ 
    public function loginAction() 
    { 
     $user = $this->container->get('security.context')->getToken()->getUser(); 

     if ($user instanceof UserInterface) { 
      $this->container->get('session')->getFlashBag()->set('sonata_user_error', 'sonata_user_already_authenticated'); 
      $url = $this->container->get('router')->generate('sonata_user_profile_show'); 

      return new RedirectResponse($url); 
     } 

     return parent::loginAction(); 
    } 
    public function renderLogin(array $data) 
    { 
     $template = sprintf('MpShopBundle:Form:login_form2.html.%s', $this->container->getParameter('fos_user.template.engine')); 

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

} 

Наконец, я изготовленный шаблон, который загружает форму:

{% block fos_user_content %} 

    <div class="span9"> 
     <div class="well"> 
      {% block sonata_user_login %} 
       <div class="panel panel-info"> 

       <div class="panel-heading"> 
        <h2 class="panel-title">{{ 'title_user_authentication'|trans({}, 'SonataUserBundle') }}</h2> 
       </div> 

       <div class="panel-body"> 

        {% block sonata_user_login_error %} 
         {% if error %} 
          <div class="alert alert-danger alert-error">{{ error|trans({}, 'FOSUserBundle') }}</div> 
         {% endif %} 
        {% endblock %} 

        {% block sonata_user_login_form %} 
         <form action="{{ path("fos_user_security_check") }}" method="post" role="form" 
           class="form-horizontal"> 
          <input type="hidden" name="_csrf_token" value="{{ csrf_token }}"/> 

          <div class="control-group"> 
           <label class="control-label control-label required" for="username" 
             class="col-sm-4 control-label">{{ 'security.login.username'|trans({}, 'SonataUserBundle') }}</label> 

           <div class="controls"> 

           <input type="text" class="form-control" id="username" name="_username" value="{{ last_username }}" required="required"/></div> 
          </div> 


          <div class="form-group control-group"> 
           <label class="control-label control-label required" for="password" 
             class="col-sm-4 control-label">{{ 'security.login.password'|trans({}, 'SonataUserBundle') }}</label> 

           <div class="controls"> 
           <input type="password" class="form-control" id="password" name="_password" required="required"/></div> 
          </div> 

          <div class="control-group"> 
           <div class="col-sm-offset-4 col-sm-8"> 
            <div class="checkbox control-group"> 
             <label class="checkbox pull-left" for="remember_me"> 
              <input type="checkbox" id="remember_me" name="_remember_me" value="on"/> 
              {{ 'security.login.remember_me'|trans({}, 'FOSUserBundle') }} 
             </label> 
            </div> 
           </div> 
          </div> 

          <div class=" control-group pull-left"> 
           <div class=""> 
            <a href="{{ path('forgetpass') }}">{{ 'forgotten_password'|trans({}, 'SonataUserBundle') }}</a> 
           </div> 
          </div> 

          <div class="form-actions"> 
           <div class="pull-left"> 
            <input type="submit" id="_submit" name="_submit" class="btn btn-primary pull-right" 
              value="{{ 'security.login.submit'|trans({}, 'FOSUserBundle') }}"/> 
           </div> 
          </div> 
         </form> 
        {% endblock %} 
       </div> 
      </div> 
      {% endblock %} 
     </div> 
     </div> 

{% endblock fos_user_content %} 

Полностью l ОШИБКА: Если я попытаюсь войти в систему /login_frm, я получаю ошибку Invalid CSRF token.. Если я вхожу в систему с /login, он отлично работает. Почему это? Cant У меня есть две формы для входа?

+0

Возможный дубликат [Токен CSRF недействителен. Пожалуйста, попробуйте повторно отправить форму] (http://stackoverflow.com/questions/23455780/the-csrf-token-is-invalid-please-try-to-resubmit-the-form) –

+0

Не дубликат, ty:) – Dominykas55

ответ

0

Потому что в стандартной форме у вас есть токен CSRF, и в вашей пользовательской форме вы этого не сделали.

Вы должны добавить {{ form_widget(form._token) }} внутри блока формы вашего HTML в веточке.

+0

у него есть «", который отлично подходит для fosuser – Koalabaerchen

+0

Это правильно, у меня есть вход .. – Dominykas55

+0

ввод с name '_csrf_token', но как насчет имени формы? Попробуйте мое решение. Я думаю, что он будет генерировать ввод с другим именем. –

Смежные вопросы