Ember.js基于会话cookie的Rails和设计认证

时间:2013-10-16 21:38:33

标签: ruby-on-rails ember.js devise

我希望使用rails,devise和基于cookie的会话,使用我的Ember.js app身份验证来满足3个目标。

  1. 如果他们没有登录,则重定向到#/sessions/new
  2. 始终在应用程序模板中显示当前用户的信息。
  3. 如果用户已登录,则会直接转到#/some/route。当前用户应该加载。
  4. 我看过这些影片视频: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);
            }
          })
    
        },
      }
    
    });
    
    

1 个答案:

答案 0 :(得分:8)

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

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

  

我发现使用Backbone / Marionette处理身份验证和重新加载授权网站内容时,我感到很痛苦,也没有必要。登录后,将它们重定向到服务器处理的不同URL,并让服务器作为经过身份验证的用户发送所需的所有内容。 https://stackoverflow.com/a/18151935

Derick的另一句话:

  

右。还有很多案例,我只是说,“不要做单页应用程序”。登录屏幕就是最好的例子。在过去几年我所有的客户中,他们都问过我,“嘿,我遇到了这个问题。我正试图让我的登录界面从服务器返回当前用户信息并在屏幕上重做所有这些内容而不刷新所有内容。“我的答案每次都是,”不要这样做。“{ {3}}

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

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

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