如何使用Ember-Auth成功登录时转换到root?

时间:2013-08-16 10:42:19

标签: javascript authentication ember.js

所以我使用基于纯令牌的方法成功实现了Ember-Auth。我想在用户登录后将其用户重定向到我的应用的根目录。

我知道我可以在文档中使用actionRedirectablehttp://ember-auth.herokuapp.com/docs),但由于我使用的是纯粹的令牌方法,而且没有在Cookie中存储任何内容,因此我每次都会在页面中再次对用户进行签名使用remember_token刷新(这似乎是不理想的,但我很快就会解决)。这意味着使用actionRedireactable意味着每次用户刷新页面时我都会重定向。也许某处有反模式?

无论如何,这是我的SignInView

App.SignInView = Ember.View.extend({

  templateName: 'auth/sign_in',

  email:    null,
  password: null,

  submit: function(event, view) {
    event.preventDefault();
    event.stopPropagation();

    App.Auth.signIn({
      data: {
        email:    this.get('email'),
        password: this.get('password')
      }
    });
  }
});

如果我在signIn调用之后直接调用this.get("controller").transitionToRoute('...'),那么此时我的用户总是没有登录,因此他们会再次重定向到登录页面。如果我尝试:

App.Auth.on('signInSuccess', function() {
  // ...
});

然后我没有任何明智的方法来访问路由器进行转换。任何好主意都会受到高度赞赏。谢谢!

2 个答案:

答案 0 :(得分:2)

作为最佳实践,您不应该在视图中使用逻辑,逻辑更适合居住在控制器中,因此对于您的用例,请在您的身份验证过程中创建App.SignInController工具:

视图

App.SignInView = Ember.View.extend({
  templateName: 'auth/sign_in',
  email:    null,
  password: null,

  submit: function(event, view) {
    event.preventDefault();
    event.stopPropagation();

    var data = {
        email:    this.get('email'),
        password: this.get('password')
    }
    // forward the action to your controller passing along the
    // data object your sign in process needs
    this.get("controller").send("signIn", data);
  }
});

此外,您不应该从路由器内部以外的其他地方转换。通过这样做,您可能会遇到严重的问题,因为您不知道您的路由器实际上是state。所以最好的办法是获取对路由器的引用,然后在路由器上调用transitionTo

控制器

App.SignInController = Ember.ObjectController.extend({
  signIn: function(data) {

    // grab your passed data object and issues you sign in
    App.Auth.signIn({
      data: data
    });

    // subscribe to the `signInSuccess` event and 
    // then transition to your route but using 
    // the router itself
    App.Auth.one('signInSuccess', function() {
      var router = this.get('target.router');
      router.transitionTo('route_name');
    });

  }
});

希望这有帮助。

答案 1 :(得分:0)

我没有经过测试,但我认为这有效:

App.SignInView = Ember.View.extend({

  templateName: 'auth/sign_in',

  email:    null,
  password: null,

  submit: function(event, view) {
    event.preventDefault();
    event.stopPropagation();
    var controller = this.get('controller');

    App.Auth.signIn({
      data: {
        email:    this.get('email'),
        password: this.get('password')
      }
    });

    App.Auth.one('signInSuccess', function() {
      controller.transitionToRoute('...');
    });

  }
});