Я применил ember-simple-auth-0.6.4.js в своем приложении ember-js, и есть один довольно распространенный случай. Вот последовательность шагов.
- Пользователь аутентифицируется в приложении (я использую для этого собственный аутентификатор). Таким образом, сеанс становится действительным.
- Через ~20 минут бездействия серверная сессия становится недействительной.
- Пользователь переходит к маршруту (производному от AuthenticatedRouteMixin), и, поскольку сеанс ember в клиентском приложении все еще действителен -> проверка «аутентифицированный сеанс» проходит.
- Затем вызывается хук модели маршрута, в котором я пытаюсь загрузить некоторые данные из бэкэнда с помощью запроса ajax - и получаю 401 неавторизованный ответ, потому что сессия бэкэнда недействительна.
- После ответа на ошибку 401 сеанс клиентского приложения становится недействительным - затем вызывается обработчик sessionInvalidationSucceeded(), определенный в application-route-mixin, где изменяется местоположение: window.location.replace(Configuration.applicationRootUrl);
Проблема в том, что если URL-адрес, определенный в applicationRootUrl, находится под аутентифицированным маршрутом, пользователю будет показана страница входа, но после аутентификации пользователь снова переходит на applicationRootUrl, но не на страницу, где изначально произошла ошибка ajax.
Мое решение этого:
В хуке AuthenticatedRouteMixin перед моделью() я сохраняю последний переход:
Configuration.beforeInvalidationTransition = transition;
В ApplicationRouteMixin я переопределяю хук sessionInvalidatedSucceeded:
sessionInvalidationSucceeded: function() { if (Configuration.beforeInvalidationTransition) { this.get(Configuration.sessionPropertyName) .set('attemptedTransition',Configuration.beforeInvalidationTransition); } this.transitionTo(Configuration.authenticationRoute);
Таким образом, если произошла ошибка 401, пользователь перенаправляется на страницу входа в систему (Configuration.authenticationRoute), а маршрут, в котором произошла ошибка, сохраняется в файле trypedTransition, поэтому после успешного входа пользователь будет перенаправлен на то место, где он перестал работать.
Есть ли смысл или есть более элегантное решение этой проблемы?