2012-09-21 18 views
4

我有兩個設計模式,用戶和業務;我希望能夠使用單一登錄表單登錄。我正在使用骨幹js,並且我有一個自定義的視圖,所以視圖不是一個問題。 ajax請求用於登錄,它按預期方式適用於用戶,但不適用於企業。設計 - 在形式單一登錄爲多個用戶

我搜索谷歌,並遇到一些解決方案,提到使用STI來解決這個問題,但該項目已經完成,我現在不能做出這樣的改變。我在考慮重寫Devise會話控制器,並且:

  1. 檢查給定的電子郵件地址是否是用戶,然後使用Warden驗證用戶身份。
  2. 如果與電子郵件地址的用戶發現,然後用監獄長的商業模式進行身份驗證。

我不知道如何改變代碼以達到上述目的,我不知道如何工作以及需要調整哪些參數以實現上述目標,需要調用哪些函數。任何人都可以向我指出正確的方向,或者提供一個我應該如何向前推進的例子。

謝謝。

回答

4

考慮只使用用戶模型,並使用CanCanRolify來解決每種類型用戶的獨特需求。這可能意味着從一些代碼開始,但從長遠來看可能更容易維護。

不要只聽我的話。 Here's a related question with good responses.

+0

我同意。現在轉到「角色」的方式,在太多時間過去之前,項目需要第三個模型。 – Zabba

6

別擔心,你不會被卡住。

我認爲你最好的選擇是重寫Devise的會話控制器並改變會話的'new'和'create'方法。

因此,在你自己的「sessions_controller.rb」,你會有這樣的事情:

class SessionsController < Devise::SessionsController 
    # GET /resource/sign_in 
    def new 
    resource = build_resource(nil, :unsafe => true) 
    clean_up_passwords(resource) 
    respond_with(resource, serialize_options(resource)) 
    end 

    # POST /resource/sign_in 
    def create 
    resource = warden.authenticate!(auth_options) 
    set_flash_message(:notice, :signed_in) if is_navigational_format? 
    sign_in(resource_name, resource) 
    respond_with resource, :location => after_sign_in_path_for(resource) 
    end 
end 

而在你的路線,你會使用的東西(這取決於你命名你的用戶模型),如:

devise_for :users, :controllers => { 
    :sessions => 'sessions' 
} 


devise_for :businesses, :controllers => { 
    :sessions => 'sessions' 
} 

上述會話控制器根本沒有自定義。我不知道你的代碼,所以我真的不能幫助。但基本步驟如下:

  1. 檢查auth_optionsresource_name變量以瞭解它們如何存儲數據。
  2. 添加您的條件邏輯來改變這些變量,如果resource沒有在用戶表中找到。

設計很棒,角色很棒,但有時候有一個用戶模型,甚至使用STI,都沒有意義。因爲我在最近的一個項目中處理了這個問題,所以我很快在這個問題上寫了一篇較長的文章。

+0

設計行動[稍微改變了一點](https://github.com/plataformatec/devise/blob/master/app/controllers/devise/sessions_controller.rb)。確保您從您使用的版本複製操作,然後更改'resource_name'以匹配您想要登錄的用戶類型(即':business')。 –

+0

嘿夥伴你做過那篇博客嗎? – hamstar

+0

@hamstar - 不,我沒有。我實際上對Devise感到厭煩,並且推出了我自己的解決方案。你有什麼問題嗎?我很樂意回答任何問題(假設我知道答案)。 – Bryce

4

最近,我想出了這個總的黑客攻擊,使這項工作。我的建議是強烈地考慮一個具有角色的單一用戶模型,但這是有效的 - 至少在當前版本的Devise中是這樣。

https://gist.github.com/jeremyw/5319386

如果您猴補丁或以其他方式覆蓋這樣的默認行爲,請確保您有如果你曾經想要嘗試升級設計一個好的測試套件。

+0

如果您包含相關的源代碼並僅提供鏈接作爲進一步參考,那將會更好。 –