2010-08-17 229 views
8

這簡直太奇怪了。設計忽略定製策略

我已經安裝了Rails 3 RC,安裝了Devise。我已經定義了一個自定義策略來嘗試使用Kerberos進行身份驗證。

module Devise 
    module Strategies 
    class Kerb < Devise::Strategies::Base 
     def valid? 
     params[:username] || params[:password] 
     end 

     def authenticate! 
     # cheap debugging 
     puts "PARAMS: #{params}" 

     if check_kerb_auth(params[:username], params[:password]) 
      # create user account if none exists 
      u = User.find(:first, :conditions => { :username => params[:username] }) || User.create({ :username => login }) 
      success!(u) 
     else 
      fail!("Could not log in") 
     end 
     end 

     def check_kerb_auth(username, password) 
     require 'krb5_auth' 
     include Krb5Auth 

     return false if username.blank? or password.blank? 

     begin 
      kerberos = Krb5.new 
      return kerberos.get_init_creds_password(username, password) 
     rescue Krb5Auth::Krb5::Exception 
      return false 
     end 
     end 
    end 
    end 
end 

我有設計Warden配置設置如下:

config.warden do |manager| 
    manager.strategies.add(:kerb, Devise::Strategies::Kerb) 
    manager.default_strategies :kerb 
end 

我在日誌中沒有錯誤。一切似乎都很好。如果我添加「廉價調試」又名一堆put語句,似乎反映了:curb策略是默認的。這是在嘗試登錄日誌的樣本集:

=> Booting WEBrick 
=> Rails 3.0.0.rc application starting in development on http://0.0.0.0:3000 
=> Call with -d to detach 
=> Ctrl-C to shutdown server 
[2010-08-17 10:50:35] INFO WEBrick 1.3.1 
[2010-08-17 10:50:35] INFO ruby 1.8.7 (2010-01-10) [x86_64-linux] 
[2010-08-17 10:50:40] INFO WEBrick::HTTPServer#start: pid=12717 port=3000 


Started POST "https://stackoverflow.com/users/login" for 127.0.0.1 at Tue Aug 17 10:50:43 -0400 2010 
    Processing by Devise::SessionsController#create as HTML 
    Parameters: {"commit"=>"Login", "authenticity_token"=>"afZF6ho96p47dc9LQFwwNN5PqnRpl7x+1J7V3MiKgTE=", "_snowman"=>"\342\230\203", "user"=>{"remember_me"=>"1", "username"=>"hernan43", "password"=>"[FILTERED]"}} 
Completed in 0ms 
    Processing by Devise::SessionsController#new as HTML 
    Parameters: {"commit"=>"Login", "authenticity_token"=>"afZF6ho96p47dc9LQFwwNN5PqnRpl7x+1J7V3MiKgTE=", "_snowman"=>"\342\230\203", "user"=>{"remember_me"=>"1", "username"=>"hernan43", "password"=>"[FILTERED]"}} 
Rendered devise/shared/_links.erb (1.2ms) 
Rendered devise/sessions/new.html.erb within layouts/application (8.2ms) 
Completed 200 OK in 124ms (Views: 11.7ms | ActiveRecord: 1.3ms) 

Kerberos身份代碼在其他事情在同一臺機器上。如果出現問題,我會期待它顯示出一堆錯誤,但我什麼也得不到。有沒有一種調試Devise/Warden的好方法?

+0

我看到同樣的事情。有沒有想過這個? – Nader 2010-09-21 02:25:59

+0

我從來沒有弄明白,所以我走了一個不同的方向。我所做的所有調試都使它看起來可以調試,但實際上並沒有工作。 – hernan43 2010-09-21 20:15:59

回答

3

我遇到了類似的問題。經過短暫的調試後,我發現原因。我的用戶沒有被確認,所以在我的策略初步成功登錄後,他被以下模塊之一註銷,這是可確認的模塊:)

順便說一句,調試rails應用程序的最簡單方法是使用以下代碼:

require 'ruby-debug' 
Debugger.wait_connection = true 
Debugger.start_remote 
debugger 

然後rdebug -c從終端。

10

萬一別人遇到這一點,這就是我認爲這個問題是:

根據Warden Strategies

有效嗎?

有效嗎?方法是策略的守護者。宣佈有效的是可選的?方法,如果你沒有聲明它,這個策略將一直運行。如果您確實聲明瞭該策略,則只有在#有效時纔會嘗試該策略。評估爲真。

上面的策略是推理,如果有'用戶名'或'密碼'參數,則用戶正在嘗試登錄。如果只有其中一個,那麼'User.authenticate'調用將失敗,但它仍然是期望的(有效的)策略。

所以您的有效方法:

def valid? 
    params[:username] || params[:password] 
end 

它返回false,所以authenticate!永遠不會被調用。 params是嵌套散列,所以它應該是params[:user][:username]而不是params[:username]

更改您的有效方法:

def valid? 
    params[:user] && (params[:user][:username] || params[:user][:password]) 
end 

將返回true,並導致被稱爲authenticate!方法。