首先,应该将静态页面设置为应用程序的登录页面吗?
其次,我的服务器端代码很好(不会提供用户不应看到的数据)。但是,我如何让我的应用程序知道如果用户未登录,则返回登录表单?
首先,应该将静态页面设置为应用程序的登录页面吗?
其次,我的服务器端代码很好(不会提供用户不应看到的数据)。但是,我如何让我的应用程序知道如果用户未登录,则返回登录表单?
我使用会话概念来控制用户的登录状态。
我有这样一个 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的视图,并将我的主视图设置为登录模式,其中它会出现一个登录提示。然后我从用户那里获取用户名和密码,并像这样在activeSession上设置它们:
login = function(userName, password){
window.activeSession.set(
{
userName: userName,
password: password
},{
silent:true
}
);
window.activeSession.save();
}
这会通过backbone.sync触发对服务器的更新。在服务器上,我已经设置了session资源的POST操作,以便它检查userName和password。如果有效,则在session上填充用户详细信息、设置唯一的session id并移除密码,然后发送结果。
我的backbone.sync还被设置为将window.activeSession的sessionId添加到任何向服务器发出的请求中。如果服务器上的sessionId无效,则会发送HTTP 401,从而触发logout(),进而显示登录提示框。
我们还没有完全实现这个功能,所以逻辑可能存在错误,但基本上是这样实现的。另外,上面的代码不是我们实际的代码,因为它包含一些处理逻辑,但这就是大概的意思。我的静态页面(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);
}
});
}
});
这是一篇非常好的it技术教程,涉及到backbone.js应用程序验证,你可以访问http://clintberry.com/2012/backbone-js-apps-authentication-tutorial/查看。
我认为你应该只在服务器端进行这个操作... 因为有很多被黑客攻击的可能性,除非你有某种惊人的API来响应它。
user
模型,它会从未登录状态变成游客再到注册用户。它类似于上面描述的会话模型,但还包括用户配置文件信息。这在很多情况下运行得非常好,因为 Backbone 中的事件监听很适合这种用例。登录/注册屏幕侦听error
,任何 UI 元素都可以侦听sync
。它可以有像.logOut
这样的方法。到目前为止,唯一的问题是操作的时间和顺序,但我仍然认为这种方法是可靠的。 - SimplGy