6

我希望通过使用 rails、devise 和基于 cookie 的会话的 Ember.js 应用程序身份验证来满足 3 个目标。

  1. #/sessions/new如果他们未登录,则重定向到。
  2. 始终在应用程序模板中显示当前用户的信息。
  3. 如果用户已登录并且他们#/some/route直接进入。当前用户应在加载时加载。

我看过这些 embercast 视频:Client-side Authentication Part 1 & Client-side Authentication Part 2。它们有点过时但很有帮助。

但仍然不能完全解决。有人有完整的 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);
        }
      })

    },
  }

});

4

1 回答 1

8

我不会说这是不可行的。但是您将做很多额外的和不必要的工作来使身份验证正常工作,这一切都可以通过简单的页面重定向来完成。

我从 Backbone.Marionette 的作者 Derick 那里收集了一些意见。虽然这些是用于 Backbone 而不是 Ember.js,但客户端身份验证的情况是相同的。

我发现尝试让 Backbone/Marionette 处理授权站点内容的身份验证和重新加载是痛苦和不必要的。一旦他们登录,将他们重定向到服务器处理的不同 URL,并让服务器作为经过身份验证的用户发送他们需要的所有内容。https://stackoverflow.com/a/18151935

Derick 的另一句话:

正确的。在很多情况下,我也直截了当地说“不要做单页应用程序”。登录屏幕就是最大的例子。在过去几年中,我遇到的所有客户都问我,“嘿,我遇到了这个问题。我正在尝试让我的登录屏幕从服务器返回当前用户信息,并在屏幕上重做所有这些内容,而无需刷新所有内容。” 我每次的回答都是:“不要那样做。” http://javascriptjabber.com/056-jsj-marionette-js-with-derick-bailey/

还要考虑其他情况,比如 Gmail。单击 Gmail 登录页面上的“登录”按钮后,您将无法顺利过渡。也会有相当大的数据加载重定向:)

从用户的角度来看,他们不会因为登录后有重定向就说 Gmail 不好。毕竟注册/注册比日常邮件操作少得多。

所以我的建议是,在用户会话更改后重新加载所有资源。让 Rails 和 Devise 以传统方式完成这些肮脏的工作。

于 2013-10-23T10:19:25.710 回答