Подтвердить что ты не робот

Лучший способ обеспечить соблюдение состояния пользователя/аутентификации в приложении Ember.JS

Работа с моим первым приложением EmberJS. Для всего приложения требуется, чтобы пользователь вошел в систему. Я пытаюсь убедить себя в том, что пользователь выполнил вход в систему (когда страница изначально загружена) и в будущем (когда пользователь вышел из системы и нет обновления).

У меня есть обработчики проверки подлинности пользователя - прямо сейчас у меня есть модель данных ember-данных и связанное с ними хранилище, которое соединяет эту ручку с авторизацией пользователя и созданием пользовательского "сеанса" (используя sessionStorage).

То, что я не знаю, как сделать, - это принудительное выполнение аутентификации пользователя при переходе по маршрутам, включая начальный переход в корневом маршруте. Где я могу поставить эту логику? Если у меня есть администратор проверки подлинности, как я могу подключить это к маршрутам? Должен ли я иметь auth-маршрут, который находится за пределами корневых маршрутов?

Примечание: дайте мне знать, если этот вопрос плохо сформулирован или мне нужно что-то объяснить лучше, я буду рад сделать это.

Edit: Я закончил тем, что сделал что-то, что я считаю немного более ember-esque, хотя, возможно, грязной реализацией. У меня есть auth statemanager, который хранит текущий ключ аутентификации пользователя, а также текущее состояние.

Всякий раз, когда что-то требует аутентификации, он просто запрашивает у него автоответчик и передает функцию обратного вызова для запуска с помощью ключа аутентификации. Если пользователь не вошел в систему, он вытаскивает форму входа, удерживая функцию обратного вызова, пока пользователь не войдет в систему.

Вот некоторые фрагменты кода, который я использую. Нужно убирать, и я забыл кое-что. http://gist.github.com/3741751

4b9b3361

Ответ 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.

Ответ 4

Пожалуйста, также взгляните на: http://www.embercasts.com/

Существует два сценария об аутентификации.

Спасибо.