backbone.js - 用户登录时的处理方式

时间:2011-04-27 18:18:26

标签: javascript jquery backbone.js underscore.js

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

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

5 个答案:

答案 0 :(得分:69)

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

我有这样的SessionModel和SessionCollection:

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

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

});

在app start上,我初始化一个全局可用的变量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操作设置,以便它检查userName和密码。如果有效,它会填写会话中的用户详细信息,设置唯一的会话ID并删除密码,然后发回结果。

然后设置我的backbone.sync以将window.activeSession的sessionId添加到对服务器的任何传出请求。如果服务器上的会话ID无效,它会发回HTTP 401,触发logout(),导致显示登录提示。

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

答案 1 :(得分:14)

我的后端调用是我的静态页面(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 :(得分:5)

答案 3 :(得分:2)

我认为你不仅要控制html显示,还要控制显示数据。因为用户可以使用firefox来更改你的javascript代码。

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

这对你有帮助。

答案 4 :(得分:-14)

我认为你应该只做这个服务器端...有很多机会将它变成黑客攻击单位,除非你有某种惊人的api响应它