2013-10-16 38 views
6

我正在使用rails,devise和基於cookie的會話使用Ember.js應用程序身份驗證來滿足3個目標。Ember.js基於會話cookie的基於Rails和設計的身份驗證

  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("https://stackoverflow.com/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); 
     } 
     }) 

    }, 
    } 

}); 

回答

8

我不會說這是不可行的。但是你會做很多額外的和不必要的工作來獲得認證,這些都可以通過簡單的頁面重定向來完成。

我收集了Derick的一些意見,Backbone.Marionette的作者。雖然這些是針對Backbone而不是Ember.js,但客戶端認證的情況是相同的。

我覺得它是痛苦的,沒有必要嘗試使Backbone/Marionette處理認證和重新加載授權網站的東西。登錄後,將它們重定向到服務器處理的其他URL,並讓服務器以經過身份驗證的用戶的身份發送所需的所有內容。 https://stackoverflow.com/a/18151935

從德里克另一句名言還有:

權。還有很多情況我只是說「不要做單頁面應用程序」。登錄屏幕就是最好的例子。在過去幾年中我所有的客戶中,他們都問過我:「嘿,我遇到了這個問題。我試圖讓我的登錄屏幕給我從服務器返回的當前用戶信息,並在屏幕上重做所有這些東西而不刷新所有內容。「我每次回答的答案是,」不要這樣做。「http://javascriptjabber.com/056-jsj-marionette-js-with-derick-bailey/

想想也是其他情況下,說的Gmail。點擊後,您不會得到平穩過渡「登錄」按鈕,Gmail的頁面的跡象。還有將相當大的數據加載被重定向以及:)

從用戶的角度來看,他們不會說因爲登錄後出現重定向而導致Gmail不好。畢竟簽名/註冊比每天的郵件操作要少得多。

所以我的建議是,在用戶會話更改後重新加載所有資源。讓Rails和Devise以傳統的方式來做這些骯髒的工作。