2010-08-17 93 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!方法。