我正在使用rails 3.0.7運行設計1.3.4。我有兩種用戶可以登錄的方式:使用網絡應用程序和使用移動網絡應用程序(通過JSON API調用)。第一種方式完全由默認的設計會議控制器處理。 API調用認證方法需要位於一個控制器中,該控制器擴展了我的Api::BaseController
。所以,我寫這第二個控制器是這樣的:設計:有多個控制器處理用戶會話
class Api::UserSessionsController < Api::BaseController
…
def create
user = warden.authenticate(:scope => :user)
if user
sign_in(:user, user)
else
# Do some error handling
end
end
end
試圖通過這種方法登錄失敗的原因在Devise::Strategies::Authenticatable
的valid_controller?
方法。由於我已將默認控制器(devise/sessions
)作爲用戶的映射控制器,因此它不允許來自我的自定義控制器的身份驗證。
我想卷我自定義功能到我自己的Devise::SessionsController
子類,但我需要的API會話控制器延長API::BaseController
,所以我不能延長Devise::SessionsController
爲好。我不想在API控制器中放置工作的默認行爲Web應用程序身份驗證方法,特別是因爲這需要從設備控制器複製它們。
有什麼建議嗎?是否有一些我錯過的配置允許多個控制器處理會話? valid_controller?
方法做了==
比較,而不是.include?
,所以我不明白這是如何工作的。
UPDATE
這是一種可怕的臨時解決方法。我不喜歡它,所以我不會將它作爲答案發布,但我認爲它可以爲所有回答者類型提供可供思考的食物:
在我的創建方法的頂部,我可以重寫Devise期望的會議控制器。
Devise.mappings[:user].controllers[:sessions] = params[:controller]
這是工作圍繞設計的預期功能(需要一個單一的,特定的控制器做會話創建),所以我不想把它。我想知道這個約束是一個安全措施還是一個約定 - 如果是爲了安全,這可能是非常糟糕的。
這是一個不錯的主意。肯定比我的總量少。我正在考慮修補設計,在'valid_controller'中執行'.include?'並在我的路由聲明中提供一個數組。 – andrewmitchell 2011-05-28 18:01:01