Я пытаюсь настроить маршруты для своего одностраничного приложения 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, где им первоначально нужно визуализировать HTML с помощью ветки, а затем JS вступает во владение и запрашивает JSON?
Сделайте только API, никаких статических страниц. Поверьте мне, я недавно разработал API среднего размера с Symfony, и это путь. Это значительно упростит вашу внутреннюю безопасность, если вы не смешиваете API со статическими страницами. Конечно, у вас могут быть статические страницы, если вы хотите иметь какую-то целевую страницу или что-то в этом роде. но старайтесь не смешивать их с основным приложением.
Даже для входа в систему не создавайте статическую страницу, а вместо этого используйте маршрут API, который проверит имя пользователя / пароль и вернет пользователю маркер аутентификации в ответ. Например, один пользователь может иметь несколько токенов (может быть зарегистрирован в нескольких местах), и токен каждый раз отправляется в заголовках запроса.
Если токен проверен нормально, symfony будет знать, к какому пользователю он принадлежит, поэтому вы будете знать «пользователя». Если токена нет, он должен вернуть «Not Authenticated», а если токен недействителен, также что-то подобное или «Bad request».
Одна вещь, которую я должен был сделать при работе с API, это то, что мне пришлось написать обработчик запросов, чтобы принять содержимое JSON и преобразовать его в объект запроса, чтобы я мог получить доступ к данным с помощью $ request-> request.
Если у вас есть какие-либо вопросы, дайте мне знать в комментарии, и я могу помочь.
Что касается маршрутизации, следуйте правилам REST, и все будет хорошо.
Других решений пока нет …