Symfony2 - FOSUserBundle - несколько местоположений входа - PullRequest
5 голосов
/ 22 марта 2012

Я использую FOSUserBundle и мне требуется возможность входа с 2 разных маршрутов (или более).Эти маршруты будут иметь разные шаблоны, а также входить в разные области.Единственное, что отличается между именами входа, это разрешение, которое требуется.Маршруты будут выглядеть примерно так:

site.com / login

site.com / admin / login

, а также возможно site.com/ajax_login

Мне удалось выяснить, как получить различные шаблоны для рендеринга, вырвав все, кроме токена CSRF из FOSUserBundle login.html.twig (который переопределяется), затем создав маршруты, которые отображают свои собственные поля входа в систему, а такжемаршрут входа в систему (чтобы отображался только токен CSRF).Это не работает для администратора / входа в систему, так как форма отправляет обратно в учетную запись, и если она не работает, вместо этого отображается эта страница.

Есть ли простой способ добиться этого?

Ответы [ 3 ]

2 голосов
/ 30 июня 2013

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

Я отправил пулл-запрос, который позволяет вам легче создавать новые шаблоны входа. Проверьте запрос на получение здесь: https://github.com/FriendsOfSymfony/FOSUserBundle/pull/1186.

Есть и другой, довольно простой способ, как этого добиться. Расширьте SecurityController и измените метод renderLogin со следующим содержимым

protected function renderLogin(array $data, $template)
{
    return $this->container->get('templating')->renderResponse('YourBundle:Security:login.html.twig');
}

Затем создайте маршрут к вновь созданному контроллеру:

admin.login:
    pattern: /admin/login
    defaults: { _controller: YourBundle:Security:login }

После этого вам нужно лишь изменить конфигурацию безопасности соответствующим образом. Измените ваш логин form_login на / admin / login, и все готово.

1 голос
/ 27 мая 2012

Вот то, что я в конце концов придумал, в основном оба используют один и тот же брандмауэр и используют один и тот же контекст, поэтому, когда я вхожу через обычный логин, они также получают доступ к администратору (при условии, что они администраторы)

firewalls:
    admin:
        context:            site
        switch_user:        true
        pattern:            /admin(.*)
        form_login:
            provider:       fos_userbundle
            login_path:     /admin/login
            success_handler: admin_authentication_handler
            use_forward:    false
            check_path:     /admin/login_check
            failure_path:   null
            use_referer:    true
            always_use_default_target_path: true
            default_target_path: /admin/
        logout:
            path:           /admin/logout
            target:         /admin/login
        anonymous:    true
    public:
        pattern:   ^/
        context:            site
        form_login:
            login_path:     /login
            success_handler: authentication_handler
            failure_handler: authentication_handler
            provider: fos_userbundle
        anonymous: true
        logout: true

Конечно, если вам нужно создать поле входа в AJAX, вам нужно переопределить обработчики успеха и ошибок и проверить, является ли запрос XmlHttpRequest и вернуть результат входа в систему.

0 голосов
/ 13 мая 2012

Не могли бы вы опубликовать свой шаблон?

Правильно ли вы отредактировали путь в шаблоне?

<form action="{{ path('form_submit') }}" method="post" {{ form_enctype(form) }}>

Вы хотите отправить форму правильному контроллеру.

...