backbone.js – 处理用户是否login

首先,应该为应用程序提供的静态页面是login页面吗?

其次,我的服务器端代码是好的(它不会给任何用户不应该能够看到的数据)。 但是,如何让我的应用程序知道,如果用户没有login,返回到login表单?

我有一个后端调用,我的客户端代码,我的静态页面(index.php),以检查当前用户是否login。让我们说你有一个后端调用api/auth/logged_in返回HTTP状态代码200如果用户login,或者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); } }); } }); 

我使用会话概念来控制用户login状态。

我有一个SessionModel和SessionCollection是这样的:

 SessionModel = Backbone.Model.extend({ defaults: { sessionId: "", userName: "", password: "", userId: "" }, isAuthorized: function(){ return Boolean(this.get("sessionId")); } }); 

在应用程序启动时,我初始化一个全局可用的variablesactiveSession。 开始时这个会话是未经授权的,任何绑定到这个模型实例的视图都可以相应的渲染 在login尝试时,我首先通过使会话无效退出。

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

这将触发任何监听activeSession的视图,并将我的主视图进入login模式,它将提出一个login提示。 然后,我从用户获取用户名和密码,并将它们设置在activeSession上,如下所示:

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

这将通过backbone.sync触发对服务器的更新。 在服务器上,我有会话资源POST操作设置,以便它检查用户名和密码。 如果有效,则会填写会话中的用户详细信息,设置唯一的会话ID并删除密码,然后发回结果。

然后,我的backbone.sync被设置为将window.activeSession的sessionId添加到对服务器的任何传出请求。 如果会话Id在服务器上无效,它会发送一个HTTP 401,触发一个注销(),导致显示login提示。

我们还没有完成这个工作,所以在逻辑上可能会有错误,但基本上,这是我们如何处理它。 另外,上面的代码不是我们的实际代码,因为它包含更多的处理逻辑,但它是它的要点。

我认为你不仅应该控制html显示,还要控制显示数据。 因为用户可以使用Firefox来改变你的JavaScript代码。

有关详细信息,您应该在用户login后向用户授予令牌,并且每次访问您的组件(如数据网格或树等)时,页面都必须从您的Web服务中获取这些数据(可能是json) web服务将检查这个令牌,如果令牌不正确或过期,你不应该给用户数据,而应该给出错误信息。 因此,即使用户使用萤火虫更改js代码,用户也无法破解安全性。

这可能对你有帮助。

我认为你应该只做这个服务器方面…有很多机会得到它被黑客单位,除非你有某种惊人的API响应它