2014-01-27 8 views
0

Я искал часы, и я не нашел действительно, как мы можем переопределить шаблон входа для пользователя и администратора.FosUserBundle Различные страницы входа

I'v создал брандмауэр администратора в 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 не выбрасываем исключение маршрута).

Routing для администратора логин:

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. Давая форму/admin/login_check (то же самое, что и в security.yml) - это исцеление?

Пожалуйста, объясните это мне. Я потерялся и застрял в этом.

ответ

2

Я очень рекомендую придерживаться документации FOSUserBundle, чтобы сделать это правильно. Контроллер для визуализации вашего действия для входа должен быть FOSUserBundle SecurityControlle loginAction. Это позволит корректно обрабатывать вход в систему с точки зрения безопасности, а также будет обрабатывать ваши сообщения об ошибках входа в систему.

1.I считаю, что FOSUserBundle использует флэш-сообщения для ошибок входа, поэтому вам необходимо реализовать это в своем шаблоне.

2.I рекомендовал бы проверить документацию 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); 
} 

Я бы рекомендовал использовать мастер формы и используя Twig блоки, которые вы можете переопределить во всех ваших других форм авторизации, что так что вы меняете только внешний вид формы, а не всю разметку формы. Если вы добавите контроллер безопасности, вам может понадобиться повторно создать маршруты входа в Ресурсы/config/routing/security.xml, чтобы использовать его.

4.Да, это нормально, но для этого есть маршруты. Я бы не стал жестко закодировать ваш путь login_check в форме, но создать маршрут и сгенерировать его. Для клиента это тот же URL-адрес, но его будет легче поддерживать.Маршрут FOS по умолчанию для проверки - «fos_user_security_check». Вы также должны использовать маршрут в файле security.yml вместо hardcoding пути. Таким образом вы можете изменить путь, просто изменив маршруты.

Это должно позволить вам использовать разные шаблоны для входа администратора и входа в систему без повторного создания всей формы и контроллера безопасности. Пусть FOS управляет безопасностью, просто расширьте и переопределите то, что вам нужно.

+0

Благодарим вас за разъяснение. Но документация Fos о переопределении шаблонов неэффективна. Можете ли вы показать мне пример? –

+0

Конечно, для переопределения шаблонов вам необходимо создать новый файл в приложении/Ресурсах, для входа в систему это будет приложение/Ресурсы/FOSUserBundle/views/Security/login.html.twig. Если вы собираетесь использовать несколько шаблонов, но один для администратора и один для конечных пользователей, вам не нужно будет переопределять шаблон defaut, вместо этого переопределите сам контроллер безопасности и просто отрисуйте собственный шаблон, где бы вы его ни разместили. Просто имейте в виду сохранить ту же самую разметку, которую они используют, поскольку login_check использует эти входные имена. – joe42

+0

Каковы имена элементов формы? Я действительно смущен. На самом деле нет настоящего примера. –

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