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

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

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

我已经看过这些embercastvideo: 客户端身份validation第1部分和客户端身份validation第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); } }) }, } }); 

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

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

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

德里克的另一个引用也是:

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

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

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

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