3

确保用户登录 Ember 应用程序的最佳方法是什么?

我想在路由被激发之前拦截任何 URL,显示一个带有 user_id/password 的模式弹出窗口,然后转到原始 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#/folder01,则在路由folder之前执行application路由。

理想情况下总结工作流程应该如下所示:

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

非常感谢!

4

3 回答 3

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();
        }
    }
});

如果 App 检测到会话超时,它会执行window.location.reload(). 能工作会很好,App.reset()但是afaik它还没有正确实施。

我不是 100% 确定这个解决方案没有内存泄漏等问题。我很想听听 Ember 专家关于这种方法的任何信息。

谢谢

于 2013-03-25T07:05:48.603 回答
0

您可以使用您的路线来完成此操作:

App.DatasetEditRoute = Ember.Route.extend({
  redirect: function() {
    if (this.controllerFor('currentUser').get('isSignedIn') === false) {
      this.transitionTo('user.login');
    }
  }
});
于 2013-03-21T19:31:58.023 回答
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)。然后,您可以显示一个登录弹出窗口,而不是重定向到登录路由。成功登录后,重新加载页面或转换到相同的路由。

于 2014-05-10T23:06:50.447 回答