簡體   English   中英

設計 - 為多個用戶單一登錄表單

[英]Devise - single sign in form for multiple users

我有兩個Devise模型,User和Business; 我希望兩者都能夠使用單一登錄形式登錄。 我正在使用骨干js,我有一個自定義的視圖,所以視圖不是一個問題。 ajax請求用於登錄,它按預期適用於用戶,但不適用於企業。

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

  1. 檢查給定的電子郵件地址是否為用戶,然后使用Warden對用戶進行身份驗證。
  2. 如果未找到具有該電子郵件的用戶,則使用Warden對Business模型進行身份驗證。

我無法弄清楚如何更改代碼來實現上述目標,我不知道warden如何工作以及我需要調整哪些params來實現上述功能,需要調用哪些函數。 任何人都可以指出我正確的方向或提供一個例子,說明我應該如何向前推進。

謝謝。

別擔心,你不會被卡住。

我認為你最好的選擇是覆蓋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. 如果在Users表中找不到resource添加條件邏輯以更改這些變量。

設計是偉大的,角色很棒,但有時擁有一個用戶模型,甚至使用STI,沒有意義。 我很快就在這個問題上寫了一篇更長的帖子,因為我在最近的一個項目中處理了這個問題。

我最近提出了這個完全黑客來完成這項工作。 我的建議是強烈考慮具有角色的單個用戶模型,但這是有效的 - 至少對於當前版本的Devise。

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

如果你monkeypatch或以其他方式覆蓋這樣的默認行為,請確保你有一個好的測試套件,以防你想要嘗試升級Devise。

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

不要只聽我的話。 這是一個有良好反應的相關問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM