2014-09-18 5 views
0

Я пытаюсь настроить маршруты для моего Symfony2 одной страницы приложения, и я не уверен, как правильно это сделать без него чувства супер Hacky.Symfony маршрутизация для REST API приложения/одной страницы

Вот что мне это нужно делать и как я попытался установить его:

Когда Аутентифицированный

  • Любой маршрут запроса application/json должен ударить маршруты они были установки как обычно.

  • Любой маршрут, который вводится без запроса application/json, должен загрузить контроллер, который отображает файл twig, содержащий все JS для моего одностраничного приложения.

  • Любой статический ресурс, который не существует, и заканчивается ищет Symfony маршрут, например, [.js, .css, .jpeg, и т.д.] должен возвращать 404.

Когда НЕ Аутентифицированный

  • Все запрашивающий application/json должен вернуть 403

  • ничего не запрашивающийдолжен вернуться на страницу входа

Вот что я пытался до сих пор:

  • маршруты Настройка с FOSRestBundle для каждой службы

  • Setup прослушивателя, возвращает HTML базового контроллера, если запрос не application/json

    if (!in_array('application/json', $request->getAcceptableContentTypes())) { 
        $fakeRequest = $event->getRequest()->duplicate(
         null, 
         null, 
         array('_controller' => 'HvHDashboardBundle:Dashboard:index') 
        ); 
        $controller = $this->resolver->getController($fakeRequest); 
        $event->setController($controller); 
    } 
    
  • Setup куча «поймать всех» маршруты фальсифицировать 404, если статический ресурс не существует.

    # routing.yml 
    # Catch any files that are meant to be their own static resource and return 404 
    catch_all_fail: 
        pattern: /{uri}.{_format} 
        defaults: { _controller: MyBundle:Dashboard:return404 } 
        requirements: 
         _format: js|hbs|css|jpg|gif|jpeg|png 
    

Вопросы

  • Такой подход чувствует, как массивный хака, а не то, как система маршрутизации Symfony предназначена для работы
  • страница базового контроллера возвращается, даже если вы не аутентифицированы, потому что прослушиватель типа попадает перед контекстом безопасности и заставляет этот контроллер визуализировать.

Вопрос:

Как другие решить эту проблему с маршрутизацией и одной странице приложения с Symfony, где они первоначально нужно сделать HTML с веткой, а затем JS берет на себя и просит JSON?

ответ

1

Только создайте API, без статических страниц. Поверьте мне, недавно я использовал API с умеренным размером с Symfony, и это путь. Это упростит защиту вашего сервера, если вы не будете смешивать API со статическими страницами. Конечно, у вас все еще есть статические страницы, если вы хотите иметь какую-то страницу Landing или что-то в этом роде. но старайтесь не смешивать их с основным приложением.

Даже для входа в систему не создавайте статическую страницу, а вместо этого используйте api-маршрут, который будет проверять имя пользователя/пароль и возвращать пользователю токен аутентификации в ответ. Например, один пользователь может иметь несколько токенов (может быть зарегистрирован в нескольких местах), а токен отправляется в заголовках запросов каждый раз.

Если токен подтвержден ok, symfony узнает, к какому пользователю он принадлежит, поэтому вы будете знать «Пользователь». Если не присутствует токен, он должен вернуть «Не проверено подлинность», а если токен недействителен, то что-то вроде этого или «Плохой запрос».

Одна вещь, которую я должен был делать при использовании API-интерфейсов, это то, что мне пришлось написать прослушиватель запросов, чтобы принять контент JSON и преобразовать его в объект запроса, чтобы я мог обращаться к данным с помощью запроса $ request->.

Если у вас есть какие-либо вопросы, дайте мне знать в комментарии, и я могу помочь.

Что касается маршрутизации, следуйте правилам REST, и вам будет хорошо идти.

+0

Спасибо. Вы рекомендуете запускать api на 'api.domain.com' и обслуживать статическую логин/целевую страницу в отдельном приложении, указанном на' domain.com'? – greg

+0

Я не знаю, зачем вам нужна статическая форма входа, если вы создаете API, но, как правило, хорошей практикой является использование разных частей системы на разных поддоменах. Мы тоже это делаем. Это также упрощает использование брандмауэра в конфиге symfony2. Например, для всего api.domain.com требуется токен аутентификации, а domain.com - анонимный токен. – tomazahlin

+0

Возможно, я собираюсь сделать это неправильно, но мне нужно, чтобы пользователь мог войти в приложение? Это должно произойти в какой-то форме. В настоящий момент логин основан на сеансе, что не идеально, я думаю, что нужно изменить, чтобы вернуть токен? – greg

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