backbone.js - обработка, если пользователь вошел в систему или нет

Во-первых, должна ли статическая страница, обслуживаемая приложением, быть страницей входа?

Во-вторых, мой код на стороне сервера в порядке (он не даст никаких данных, которые пользователь не должен видеть). Но как мне сделать так, чтобы мое приложение знало, что, если пользователь не вошел в систему, чтобы вернуться к форме входа?

5 ответов

Решение

У меня есть бэкэнд-вызов, который мой код на стороне клиента делает моей статической страницей (index.php), чтобы проверить, вошел ли текущий пользователь в систему. Допустим, у вас есть бэкэнд-вызов в api/auth/logged_in который возвращает код состояния HTTP 200 если пользователь вошел в систему или 400 в противном случае (используя сеансы на основе файлов cookie):

appController.checkUser(function(isLoggedIn){
    if(!isLoggedIn) {
        window.location.hash = "login";    
    }

    Backbone.history.start();
});

...

window.AppController = Backbone.Controller.extend({

  checkUser: function(callback) {
     var that = this;

     $.ajax("api/auth/logged_in", {
       type: "GET",
       dataType: "json",
       success: function() {
         return callback(true);
       },
       error: function() {
         return callback(false);
       }
     });
  }
});

Я использую концепцию сеанса для управления состоянием входа пользователя.

У меня есть SessionModel и SessionCollection, как это:

SessionModel = Backbone.Model.extend({
    defaults: {
        sessionId: "",
        userName: "",
        password: "",
        userId: ""
    },

    isAuthorized: function(){
       return Boolean(this.get("sessionId"));
    }

});

При запуске приложения я инициализирую глобально доступную переменную activeSession. При запуске этот сеанс является неавторизованным, и любые представления, привязанные к этому экземпляру модели, могут отображаться соответствующим образом. При попытке входа в систему я сначала выхожу из системы путем аннулирования сеанса.

logout = function(){
    window.activeSession.id = "";
    window.activeSession.clear();
}

Это вызовет любые представления, которые прослушивают activeSession, и переведет мой mainView в режим входа в систему, где будет отображаться приглашение на вход. Затем я получаю userName и пароль от пользователя и устанавливаю их в activeSession следующим образом:

login = function(userName, password){
    window.activeSession.set(
        {
            userName: userName,
            password: password
        },{
            silent:true
        }
    );
    window.activeSession.save();
}

Это приведет к обновлению сервера через backbone.sync. На сервере у меня есть настройка действия POST ресурса сеанса, чтобы он проверял имя пользователя и пароль. Если он действителен, он заполняет данные пользователя о сеансе, устанавливает уникальный идентификатор сеанса и удаляет пароль, а затем отправляет результат обратно.

Мой backbone.sync затем настраивается для добавления sessionId window.activeSession к любому исходящему запросу на сервер. Если идентификатор сеанса недействителен на сервере, он отправляет обратно HTTP 401, который вызывает выход из системы (), что приводит к отображению приглашения на вход в систему.

Мы еще не совсем реализовали это, поэтому в логике могут быть ошибки, но в основном именно так мы к этому подходим. Кроме того, приведенный выше код не является нашим реальным кодом, поскольку он содержит немного больше логики обработки, но это суть этого.

Вот очень хороший учебник для него http://clintberry.com/2012/backbone-js-apps-authentication-tutorial/

Я думаю, что вы должны не только контролировать отображение HTML, но и контролировать данные дисплея. Потому что пользователь может использовать Firefox, чтобы изменить свой код JavaScript.

Для подробностей вы должны дать пользователю маркер после того, как он войдет в систему, и каждый раз, когда он или она посещают ваш компонент на странице, такой как сетка данных или дерево или что-то в этом роде, страница должна получать эти данные (возможно, в json) из вашего веб-сервиса, и веб-служба проверит этот токен, если токен неправильный или просрочен, вы не должны предоставлять данные пользователя, а должны выдавать сообщение об ошибке. Так что пользователь не сможет взломать вашу безопасность, даже если он или она использует firebug для изменения кода js.

Это может помочь вам.

Я думаю, что вы должны делать только этот сервер на стороне... Есть много шансов получить взломанный модуль, и если у вас есть какие-то удивительные API реагировать на него

Другие вопросы по тегам