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

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

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

Ответ 1

У меня есть бэкэнд-код, который мой клиентский код, который делает моя статическая страница (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);
       }
     });
  }
});

Ответ 2

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

У меня есть 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 ресурса сеанса, чтобы он проверял имя пользователя и пароль. Если он действителен, он заполняет детали пользователя в сеансе, устанавливает уникальный идентификатор сеанса и удаляет пароль, а затем отправляет результат.

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

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

Ответ 4

Я думаю, вы должны не только контролировать отображение html, но и управлять отображаемыми данными. Поскольку пользователь может использовать firefox для изменения кода javascript.

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

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

Ответ 5

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