基于Rails和devise的Ember.js会话cookie身份验证

6
我希望我的Ember.js应用程序可以通过Rails、Devise和基于cookie的会话实现身份验证,满足以下3个目标。
  1. 若用户未登录,则重定向到#/sessions/new
  2. 在应用程序模板中始终显示当前用户的信息。
  3. 如果用户已登录并直接访问#/some/route,则应该在页面加载时加载当前用户。
我已经观看了这些Embercast视频:客户端身份验证第一部分客户端身份验证第二部分。虽然它们有点过时,但仍然很有帮助。
但是我仍然找不到完整的Rails 4、Devise、Emberjs 1.0.0示例。最大的问题是如何在页面加载时加载当前用户,并在提交登录表单时设置当前用户。
目前,我的策略如下:

App.User = Em.Object.extend();

App.User.reopenClass({
  current: function() {
    return Ember.$.getJSON("/users/current").then(function(data) {
      return data
    })
  }
});

App.ApplicationRoute = Ember.Route.extend({
  model: function() {
    return App.User.current();
  }
});

App.SessionsNewController = Ember.ObjectController.extend({

  actions: {
    save: function(data) {
      var self = this, data = this.getProperties('email', 'password');

      $.post("/sessions", { session: data }).always(function(response, status, data) {
        if (status == "success") {
          self.transitionToRoute('index');
        } else {
          self.set('errorMessage', data);
        }
      })

    },
  }

});

1个回答

8
我不会说这是不可行的。但是,你需要做很多额外和不必要的工作来使认证工作正常运行,而这些都可以通过简单的页面重定向完成。
我从Backbone.Marionette的作者Derick那里收集了一些意见。虽然这些意见是针对Backbone而不是Ember.js的,但客户端认证的情况是相同的。

我觉得让Backbone/Marionette处理认证和重新加载授权站点的内容很痛苦且没有必要。一旦他们登录,将他们重定向到服务器处理的不同URL,并让服务器以已验证用户的身份发送下所有他们需要的东西。https://dev59.com/j3XYa4cB1Zd3GeqP64Dr#18151935

还有Derick的另一句话:
“没错。在很多情况下,我会直截了当地说‘不要做单页应用程序’。登录界面就是最好的例子。在过去几年里,我所有的客户都问我:‘嘿,我有这个问题。我想从服务器获取当前用户信息并在不刷新整个页面的情况下重新显示所有内容。’我的回答每一次都是:‘不要这样做。’” http://javascriptjabber.com/056-jsj-marionette-js-with-derick-bailey/ “还有其他情况,比如Gmail。在Gmail的登录页面点击‘登录’按钮后,你不会得到一个平稳的过渡效果。还会有一个重定向和相当大的数据加载 :)”
“从用户的角度来看,他们不会因为登录后出现重定向而认为Gmail不好。毕竟,登录/注册远不如日常邮件操作频繁。”
“所以我的建议是,在用户会话更改后重新加载所有资源。让Rails和Devise以传统方式完成这些脏活。”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接