Symfony маршрутизация для REST API / одностраничного приложения

Я пытаюсь настроить маршруты для своего одностраничного приложения Symfony2, и я не уверен, как это сделать правильно, не чувствуя себя супер хакером.

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

При проверке подлинности

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

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

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

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

  • Все, что просит application/json должен вернуть 403

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

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

  • Настройка маршрутов с помощью FOSRestBundle для каждого сервиса

  • Установите прослушиватель, который возвращает базовый контроллер 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);
    }
    
  • Установите набор «поймать все» маршруты для подделки 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?

0

Решение

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

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

Если токен проверен нормально, symfony будет знать, к какому пользователю он принадлежит, поэтому вы будете знать «пользователя». Если токена нет, он должен вернуть «Not Authenticated», а если токен недействителен, также что-то подобное или «Bad request».

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

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]