Javascript backbone.js-处理用户是否登录

Javascript backbone.js-处理用户是否登录,javascript,jquery,backbone.js,underscore.js,Javascript,Jquery,Backbone.js,Underscore.js,首先,为应用程序提供的静态页面应该是登录页面吗 其次,我的服务器端代码很好(它不会提供任何用户看不到的数据)。但是我如何让我的应用程序知道,如果用户没有登录,返回登录表单?我有一个后端调用,我的静态页面(index.php)的客户端代码用来检查当前用户是否登录。假设您在api/auth/logged\u-in上有一个后端调用,如果用户登录,则返回HTTP状态代码200,否则返回400(使用基于cookie的会话): 我使用会话概念来控制用户登录状态 我有一个SessionModel和Sessio

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


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

我有一个后端调用,我的静态页面(index.php)的客户端代码用来检查当前用户是否登录。假设您在
api/auth/logged\u-in
上有一个后端调用,如果用户登录,则返回HTTP状态代码
200
,否则返回
400
(使用基于cookie的会话):


我使用会话概念来控制用户登录状态

我有一个SessionModel和SessionCollection,如下所示:

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

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

});
login = function(userName, password){
    window.activeSession.set(
        {
            userName: userName,
            password: password
        },{
            silent:true
        }
    );
    window.activeSession.save();
}
在应用程序启动时,我初始化一个全局可用的变量activeSession。开始时,此会话未经授权,绑定到此模型实例的任何视图都可以相应地渲染。在尝试登录时,我首先通过使会话无效来注销

logout = function(){
    window.activeSession.id = "";
    window.activeSession.clear();
}
这将触发任何侦听activeSession的视图,并将我的mainView置于登录模式,在此模式下,它将显示登录提示。然后,我从用户处获取用户名和密码,并在activeSession上进行如下设置:

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

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

});
login = function(userName, password){
    window.activeSession.set(
        {
            userName: userName,
            password: password
        },{
            silent:true
        }
    );
    window.activeSession.save();
}
这将通过backbone.sync触发对服务器的更新。在服务器上,我有会话资源POST操作设置,以便它检查用户名和密码。如果有效,它将填写会话的用户详细信息,设置唯一的会话id并删除密码,然后返回结果

然后设置My backbone.sync,将window.activeSession的sessionId添加到服务器的任何传出请求中。如果会话Id在服务器上无效,它将发回HTTP 401,从而触发注销(),从而显示登录提示


我们还没有完全实现它,所以在逻辑上可能会有错误,但基本上,这就是我们处理它的方式。此外,上面的代码不是我们的实际代码,因为它包含了更多的处理逻辑,但这是它的要点。

我认为您应该只在服务器端执行此操作。。。有很多机会让它被黑客攻击,除非你有某种惊人的api响应它,否则我认为你不仅应该控制html显示,还应该控制显示数据。因为用户可以使用firefox更改javascript代码

详细来说,用户登录后应该给他一个令牌,每次他或她访问页面中的组件(如数据网格或树或类似的东西)时,页面必须从您的Web服务获取这些数据(可能是json),Web服务将检查此令牌,如果令牌不正确或过期,则不应提供用户数据,而应提供错误消息。因此,即使用户使用firebug更改js代码,也无法破解您的安全性


这可能会对您有所帮助。

这是一个非常好的教程

在收到任何数据之前,您将如何检查?因此,每当应用程序调用数据时,它都会检查它们是否已登录。如果不是,它会转到登录页面。如果你想检查对后端的每次调用,你应该将其与后端代码集成。例如,如果用户未通过任何呼叫的身份验证,则您可以从后端返回
401未经授权的
,或者您可以在客户端捕获的内容。这样,您不必在每次数据请求之前单独调用以检查授权。在这种情况下,您可能必须重写
主干.sync
方法来捕获
401 Unauthorized
并发出一些事件,您可以使用这些事件来检测后端调用是否未经授权。实际上,我稍微改变了行为。我知道通过sessionCollection.create()创建新会话,然后触发一条全局可用的LoginSucess消息,任何视图都可以侦听该消息。您的方法听起来很棒。您是否有机会分享更新代码的要点?:)不幸的是,由于后端的问题(我们希望在后端使用现成的身份验证系统),我们从这个解决方案转移到了一个单独的身份验证机制(目前基于cookie),这仍然值得分享一点教程,甚至是一把小提琴。当然,感谢您的解释。我找到了解决方案:您需要先给它一个ID,否则BB会认为它还没有在数据库中持久化,因此不会麻烦发送删除请求:window.activeSession.set(“ID”,0);您也应该在服务器端这样做,但是如果您不依赖于客户端,那么在客户端检测登录状态并没有什么错。