Лучший способ обеспечить соблюдение состояния пользователя/аутентификации в приложении Ember.JS
Работа с моим первым приложением EmberJS. Для всего приложения требуется, чтобы пользователь вошел в систему. Я пытаюсь убедить себя в том, что пользователь выполнил вход в систему (когда страница изначально загружена) и в будущем (когда пользователь вышел из системы и нет обновления).
У меня есть обработчики проверки подлинности пользователя - прямо сейчас у меня есть модель данных ember-данных и связанное с ними хранилище, которое соединяет эту ручку с авторизацией пользователя и созданием пользовательского "сеанса" (используя sessionStorage).
То, что я не знаю, как сделать, - это принудительное выполнение аутентификации пользователя при переходе по маршрутам, включая начальный переход в корневом маршруте. Где я могу поставить эту логику? Если у меня есть администратор проверки подлинности, как я могу подключить это к маршрутам? Должен ли я иметь auth-маршрут, который находится за пределами корневых маршрутов?
Примечание: дайте мне знать, если этот вопрос плохо сформулирован или мне нужно что-то объяснить лучше, я буду рад сделать это.
Edit:
Я закончил тем, что сделал что-то, что я считаю немного более ember-esque, хотя, возможно, грязной реализацией. У меня есть auth statemanager, который хранит текущий ключ аутентификации пользователя, а также текущее состояние.
Всякий раз, когда что-то требует аутентификации, он просто запрашивает у него автоответчик и передает функцию обратного вызова для запуска с помощью ключа аутентификации. Если пользователь не вошел в систему, он вытаскивает форму входа, удерживая функцию обратного вызова, пока пользователь не войдет в систему.
Вот некоторые фрагменты кода, который я использую. Нужно убирать, и я забыл кое-что. http://gist.github.com/3741751
Ответы
Ответ 1
Если вам нужно выполнить проверку перед переходом начального состояния, в классе Ember.Application
есть специальная функция deferReadiness()
. Комментарий от исходного кода:
По умолчанию маршрутизатор начнет пытаться перевести текущий URL-адрес в состояние приложения, когда браузер выдает событие DOMContentReady
. если ты необходимо отложить маршрутизацию, вы можете вызвать метод приложения deferReadiness()
. После начала маршрутизации вызовите метод advanceReadiness()
.
Обратите внимание, что во время записи эта функция доступна только в ember-latest
Ответ 2
В терминах проверки подлинности между переходами маршрута вы можете добавить крюки в методы enter
и exit
Ember.Route
:
var redirectToLogin = function(router){
// Do your login check here.
if (!App.loggedIn) {
Ember.run.next(this, function(){
if (router.currentState.name != "login") {
router.transitionTo('root.login');
}
})
}
};
// Define the routes.
App.Router = Ember.Router.extend({
root: Ember.Route.extend({
enter: redirectToLogin,
login: Ember.Route.Extend({
route: 'login',
exit: redirectToLogin,
connectOutlets: function(router){
router.get('applicationController').connectOutlet('login');
}
}),
....
})
});
Проблема с таким решением заключается в том, что Ember фактически перейдет на новый маршрут (и, таким образом, загрузит все данные и т.д.), а затем перейдет обратно на ваш логин. Таким образом, потенциально выставляя фрагменты вашего приложения, вы не хотите, чтобы они видели больше. Однако реальность такова, что все эти данные все еще загружаются в память и доступны через консоль JavaScript, поэтому я считаю, что это достойное решение.
Также помните, что поскольку Ember.Route.extend возвращает новый объект, вы можете создать свою собственную оболочку, а затем повторно использовать ее во всем приложении:
App.AuthenticatedRoute = Ember.Route.extend({
enter: redirectToLogin
});
App.Router = Ember.Router.extend({
root: Ember.Route.extend({
index: App.AuthenticatedRoute.extend({
...
})
})
});
Если вы используете вышеупомянутое решение, вы можете вишневым выбрать точно, какие маршруты вы аутентифицируете. Вы также можете отбросить "проверить, переходят ли они на экран входа" в redirectToLogin
.
Ответ 3
Я собрал супер простой пакет для управления сессией и auth, называемый Ember.Session https://github.com/andrewreedy/ember-session
Ответ 4
Пожалуйста, также взгляните на:
http://www.embercasts.com/
Существует два сценария об аутентификации.
Спасибо.