2014-06-13 42 views
1

我试图在Ember.js 1.5中开发一个非常简单的认证系统,但我在前端部分遇到了一些麻烦。在ember.js中构建一个非常简单的认证系统

我对烬来说很新,所以请原谅我的无知。

因此,这里有我的路线,它们的实现

App.Router.map(function() { 
    this.route('login'); 
    this.resource("posts"); 

}); 

App.AuthenticatedRoute = Ember.Route.extend({ 
    beforeModel: function(transition) { 
     if (Ember.isEmpty(App.Auth.get('authToken'))) { 
      this.transitionTo('login'); 
     } 
    } 
}); 

App.LoginRoute = Ember.Route.extend({ 
    renderTemplate: function() { 
     this.render('login_template'); 
    }, 
    actions: { 
     createSession: function() { 
      var router = this; 
      var email = this.controller.get('email_login'); 
      var password = this.controller.get('password_login'); 


      if (!Ember.isEmpty(email) && !Ember.isEmpty(password)) { 


       $.post('/api/v1/session', {email: email, password: password}, function(data) { 
        var authToken = data.session.auth_token; 
        var user_id = data.session.user_id; 

        App.Store.authToken = authToken; 
        App.Auth = Ember.object.create({ 
         authToken: authToken, 
         user_id: user_id 
        }); 

        router.transitionTo('index'); 
       }); 



      } 
     } 
    } 
}); 

App.ApplicationRoute = App.AuthenticatedRoute.extend({ 

    model: function() { 
     return this.store.find('post'); 
    } 

}); 

App.ProceduresRoute = App.AuthenticatedRoute.extend({ 
    model: function() { 
     return this.store.all('post'); 
    } 
}); 


// Ommitting the models because they aren't necessary for this question 

所以当然主要关心的是,App.Auth最初是不确定的。我已经复制了教程中的大部分代码,但我不知道是否有可以初始化的任何session variables。在任何情况下,我总是可以在开始时定义App.Auth,其初始值为null,因为它的属性可能会产生其他后果,但我不知道(我是新来的ember)。

所以我在这里的问题是,如何正确存储来自服务器(auth_token和user_id)的响应。此外,如果auth_token没有设置(这是我正在尝试使用已验证的路由部分),请让用户重定向到login路由。

如果你不能提供完整的答案,甚至一些提示/评论将非常有帮助,谢谢!

+1

你是什么意思的好方式?除了空对象引用之外,还有一些特定的问题吗? 'Ember.isEmpty(Ember.get(App,'Auth'))' – Kingpin2k

+0

我的意思是说,如何避免这个'null'问题,再加上用ember的最佳实践来存储这样的东西。 – user1952811

+0

我能否像其他控制器那样访问Auth变量,在其他应用程序中的哪个位置? – user1952811

回答

0

我可能会使用容器注册一个身份验证管理器,并将其注入到一切。

App.initializer({ 
    name: "auth", 
    before: ['ember-data'], 
    initialize: function (container, application) { 
     var auth = Ember.Object.extend({ 
     isAuthenticated: Em.computed.notEmpty('authToken') 
     }); 

     application.register("my:authToken", auth); 
     application.inject("controller", "auth", "my:authToken"); 
     application.inject("route", "auth", "my:authToken"); 
     application.inject("store:main", "auth", "my:authToken"); 
     application.inject("adapter", "auth", "my:authToken"); 
    } 
}); 

那么你的适配器上,你可以很容易地(如果需要)挂钩头

App.ApplicationAdapter = DS.RESTAdapter.extend({ 
    headers: function() { 
    return { 
     authToken: this.get('auth.authToken') 
    }; 
    }.property("auth.authToken") 
}); 

从任何控制器/路线,你可以很容易地从this.auth

App.AuthenticatedRoute = Ember.Route.extend({ 
    beforeModel: function(transition) { 
     if (!this.auth.get('isAuthenticated')) { 
      this.transitionTo('login'); 
     } 
    } 
}); 

这里的访问身份验证属性一个注入的例子(注意,我使用Ember Data 1.0 beta 8,这个功能的一部分,头文件在老版本的Ember Data中不可用)。

http://emberjs.jsbin.com/OxIDiVU/639/edit

+0

我需要能够获取和设置autoToken以及user_id 所以第一个问题是我如何在我的登录路线的操作方法中设置authToken/user_id? 它是否像'this.auth.set('authToken')'一样简单? – user1952811

+0

这似乎不起作用,特别是在登录路线。尝试设置'authToken'时会弹出错误'auth'; – user1952811

+0

this.auth.set('authToken','foo'),它看起来像它工作正常,http://emberjs.jsbin.com/OxIDiVU/648/edit,你确定你在范围内路由/控制器,而不在返回的Ajax调用的范围内? – Kingpin2k

相关问题