2013-03-21 52 views
3

确保用户登录到Ember应用程序的最佳方式是什么?确保用户在Ember应用程序中登录

我想在路由激动之前拦截任何URL,显示带有user_id /密码的模式弹出窗口,并转到原始URL。

也许类似于Rail的application_controller#before_filter,它在任何其他控制器方法之前执行。

我有以下路径:

App.Router.map(function(){ 
    this.resource('folder', {path: '/'}, function(){ 
     this.resource('files', {path: '/:folder_id'}, function(){ 
      this.route('index'); 
     }); 
    }); 
}); 

我试图建立ApplicationRoute:

App.ApplicationRoute = Ember.Route.extend({ 
    activate: function(){ 
     console.log("activating app route"); 
    } 
}); 

但问题是,如果我打index.html#/folder01folder路线是application路线之前执行。

总结工作流程的理想应该是这样:

  1. 用户点击index.html#/folder01 URL
  2. 应用程序检查用户是否登录如果没有模式弹出出现
  3. 登录后,应用程序应该呈现index.html#/folder01 URL

非常感谢!

+0

请看[this](http://stackoverflow.com/questions/15416143/ember-js-authentication/15429584#15429584)especialy the redirect method – pjlammertyn 2013-03-21 19:19:44

回答

0

您可以使用您的路线来实现:

App.DatasetEditRoute = Ember.Route.extend({ 
    redirect: function() { 
    if (this.controllerFor('currentUser').get('isSignedIn') === false) { 
     this.transitionTo('user.login'); 
    } 
    } 
}); 
1

看起来像我发现一个可行的解决方案。那就是:

App.Router.reopen({ 
    startRouting: function() { 
     if (!App.userProfile.get('loggedIn')) { 
      $("#login_dialog").modal('show').one('click', "#login_btn", function(){ 
       $("#login_dialog").modal('hide'); 
       App.userProfile.set('loggedIn', true); 
       App.startRouting(); 
      }); 
     } else { 
      this._super(); 
     } 
    } 
}); 

如果应用程序检测会话超时,则执行window.location.reload()。将很高兴有App.reset()工作,但afaik它尚未正确实施。

我不是100%确定此解决方案没有像内存泄漏或类似的问题。我很想听听Ember专家对这种方法的看法。

感谢

0

我创建userapp-ember这对用户身份验证的Ember.js模块。它的意思是UserApp,但是它是开源的,所以你可以修改它来使用你自己的服务,如果你愿意的话。

为了证明我简短如何解决了这个问题:

App.ProtectedRouteMixin = Ember.Mixin.create({ 
    beforeModel: function(transition) { 
    // check if the user if authenticated 
    if (!isAuthenticated) { 
     transition.abort(); 
     this.transitionTo('login'); // transition to the login route 
    } 
    } 
}); 

App.IndexRoute = Ember.Route.extend(App.ProtectedRouteMixin); 

我用一个mixin扩展,我想保护的所有路由。如果用户未登录,mixin将监听beforeModel事件并中止转换(isAuthenticated)。然后,而不是重定向到登录路线,而是可以显示登录弹出窗口。登录成功后,重新加载页面或转换到相同的路由。