我在Rails 3應用中使用Devise進行身份驗證。該應用程序使用PostgreSQL模式和Apartment gem來促進多租戶。在用Rails和Devise註冊後將用戶登錄到他們的子域
登錄和退出特定的子域正在很好地工作後帳戶被創建。用戶只能在他們的特定帳戶的子域名上登錄,這很好。
這裏就是我遇到的問題...
一個全新的用戶點擊註冊網址爲:
http://foo.com/signup
默認情況下,當他們點擊提交,新帳戶被創建,但用戶發送到:
http://foo.com/dashboard
相反,我想他們去:
http://myaccount.foo.com/dashboard
爲了實現這一點,我在registrations_controller.rb
文件推翻了after_sign_up_path_for
方法:
def after_sign_up_path_for(resource)
root_url(:subdomain => resource.account.subdomain)
end
這按預期工作 - 它加載正確的URL - 但用戶的會議是創建爲根域(foo.com)而不是子域,所以用戶被要求登錄。
我發現的一個建議是將config/initializers/session_store.rb
更改爲:
config.session_store :cookie_store, :key => '_domain_session', :domain => :all
但是,這允許任何人登錄到任何子域的帳戶,顯然不是很酷。
問:我怎樣才能確保在註冊創建的會話有效期爲這是在註冊過程中創建
您需要更改cookie,就像您在問題中寫的一樣。否則用戶將始終在子域上未知。一個簡單的解決方案是編寫一個before-filter或者擴展現有的登錄邏輯來檢查正確的子域。這是通常完成的事情,因爲您不想依靠Cookie進行身份驗證。 – phoet
@phoet嗯,我想過這個。所以我應該做':domain =>'.mydomain'(允許跨子域Cookie),然後修改我的'before_filter'來檢查正確的子域? –
我使用了一箇中間件的cookie的東西:https://github.com/phoet/on_ruby/blob/master/app/middlewares/cookie_domain.rb – phoet