Symfony2, переключитесь на HTTPS после аутентификации - PullRequest
6 голосов
/ 30 ноября 2011

Я хочу заставить пользователя использовать HTTPS вместо HTTP, но только после аутентификации. Единственный вариант, который я нашел, - принудительное использование HTTPS для каждого контроллера / метода. Анонимные пользователи должны использовать только HTTP.

Как установить force-HTTPS только для аутентифицированных пользователей и заставить НЕ использовать HTTPS для неаутентифицированных пользователей на всех контроллерах в моем комплекте?

Опять же - речь не идет об отключении HTTPS для страницы авторизации.

Я хочу использовать все те же контроллеры для аутентифицированных и не прошедших проверку пользователей, но вынуждаю тех, кто вошел в систему, использовать HTTPS, а тех, кто не использует HTTP. В основном добавьте требование для HTTPS для ВСЕХ контроллеров, когда пользователь аутентифицирован.

Этот вопрос относится к Symfony 2. Я хочу сделать это с помощью механизмов Symfony. Я знаю, как обнаружить эту вещь, но она сломает ссылки Twig. Symfony может автоматически переключаться на HTTPS, я просто хочу знать, как это сделать для каждого пользователя, а не для контроллера.

Ответы [ 2 ]

10 голосов
/ 30 ноября 2011

Можно подумать, что контроллер доступа сделает это за нас:

access_control:
    - { role: ROLE_USER, requires_channel: https }
    - { role: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: http }

Но нет ... Я думаю, это была бы очень хорошая функция.

В этом случае мы можем взломать что-нибудь вместе со слушателем запроса, используя события ядра:

namespace YourBundle\EventListener;

use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpFoundation\RedirectResponse;

class RequestListener
{
    public function onKernelRequest(GetResponseEvent $event)
    {
        $request = $event->getRequest();

        // force ssl based on authentication
        if ($this->container->get('security.context')->isGranted('IS_AUTHENTICATED_FULLY')) {
            if (!$request->isSecure()) {
                $request->server->set('HTTPS', true);
                $request->server->set('SERVER_PORT', 443);
                $event->setResponse(new RedirectResponse($request->getUri()));
            } 
        } else {
            if ($request->isSecure()) {
                $request->server->set('HTTPS', false);
                $request->server->set('SERVER_PORT', 80);
                $event->setResponse(new RedirectResponse($request->getUri()));
            }
        }
    }
}

Определите ваш слушатель в config.yml под сервисами:

myapp.request.listener:
    class: MyApp\MyBundle\EventListener\RequestListener
    tags:
        - { name: kernel.event_listener, event: kernel.request }

См. Symfony Internals для подробностей о событиях и тому подобное.

2 голосов
/ 28 февраля 2012

В Symfony 2.0.11 я получаю ошибку перенаправления. Чтобы решить эту проблему, я закомментировал следующие строки в слушателе.

class RequestListener {
    public function onKernelRequest(GetResponseEvent $event) {
        $request = $event->getRequest();

        // force ssl based on authentication
        if     ($this->container->get('security.context')->isGranted('IS_AUTHENTICATED_FULLY')) {
            if (!$request->isSecure()) {
                $request->server->set('HTTPS', true);
                $request->server->set('SERVER_PORT', 443);
                // $event->setResponse(new RedirectResponse($request->getUri()));
            } 
        } else {
            if ($request->isSecure()) {
                $request->server->set('HTTPS', false);
                $request->server->set('SERVER_PORT', 80);
                // $event->setResponse(new RedirectResponse($request->getUri()));
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...