2011-05-26 68 views
7

我正在使用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::Authenticatablevalid_controller?方法。由於我已將默認控制器(devise/sessions)作爲用戶的映射控制器,因此它不允許來自我的自定義控制器的身份驗證。

我想卷我自定義功能到我自己的Devise::SessionsController子類,但我需要的API會話控制器延長API::BaseController,所以我不能延長Devise::SessionsController爲好。我不想在API控制器中放置工作的默認行爲Web應用程序身份驗證方法,特別是因爲這需要從設備控制器複製它們。

有什麼建議嗎?是否有一些我錯過的配置允許多個控制器處理會話? valid_controller?方法做了==比較,而不是.include?,所以我不明白這是如何工作的。

UPDATE

這是一種可怕的臨時解決方法。我不喜歡它,所以我不會將它作爲答案發布,但我認爲它可以爲所有回答者類型提供可供思考的食物:

在我的創建方法的頂部,我可以重寫Devise期望的會議控制器。

Devise.mappings[:user].controllers[:sessions] = params[:controller] 

這是工作圍繞設計的預期功能(需要一個單一的,特定的控制器做會話創建),所以我不想把它。我想知道這個約束是一個安全措施還是一個約定 - 如果是爲了安全,這可能是非常糟糕的。

回答

1

我只能建議另一個解決辦法(也許更少可怕嗎?) 在初始化可以覆蓋#valid_controller?是這樣的:

require 'devise/strategies/authenticatable' 
require 'devise/strategies/database_authenticatable' 

class Devise::Strategies::DatabaseAuthenticatable 
    def valid_controller? 
    # your logic here 
    true 
    end 
end 

我會有興趣知道這個約束的原因太

+0

這是一個不錯的主意。肯定比我的總量少。我正在考慮修補設計,在'valid_controller'中執行'.include?'並在我的路由聲明中提供一個數組。 – andrewmitchell 2011-05-28 18:01:01

0

我在Rails 3.2.13中使用Devise 2.2.7。上述兩種方法都不適用於我:Devise::Strategies::DatabaseAuthenticatable中的valid_vontroller?方法不再存在。 Devise.mappings[:user].controllers[:sessions]也不適合我。

經過this thread挖掘後,我發現valid_params_request?負責確保請求應通過身份驗證系統發送。有一個幫助程序方法allows_params_authentication!,它可以使Devise::SessionsController處理認證請求。

你可以從任何控制器通過身份驗證的用戶:

def signin 
    allow_params_authentication! 
    authenticate_user! 
end 

如果你想重定向到一個自定義頁面在驗證失敗:

resource = warden.authenticate!({ 
    :scope => :user, 
    :recall => "#{controller_path}#login" 
}) 
sign_in(:user, resource) 

我碰到的需要來進行外處理驗證一個Devise::SessionsController的子類通過開發一個與Spree Commerce一起工作的引擎,它已經實現了設計認證。