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 реагировать на него