设计忽略自定义策略

这简直太奇怪了。

我安装了Devise,运行Rails 3 RC。 我已经定义了一个自定义策略来尝试使用Kerberos进行身份validation。

module Devise module Strategies class Kerb  { :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 

我有Devise 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 "/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?

如果其他人遇到这个问题,我认为问题是:

根据Warden Strategies的说法:

有效?

有效吗? 方法充当策略的守卫。 声明有效是可选的吗? 方法,如果您不声明它,将始终运行策略。 如果您确实声明了它,那么只有在#valid时才会尝试策略? 评估为真。

上面的策略是推断,如果有’用户名’或’密码’参数,那么用户正在尝试登录。 如果只有其中一个,那么’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! 要调用的方法。

我遇到了类似的问题。 经过短暂的调试后,我发现了原因。 我的用户没有得到确认,所以在我最初成功登录我的策略后,他被以下模块中的一个注销,这是可确认的模块:)

顺便说一句,调试rails应用程序的最简单方法是使用以下代码:

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

然后从终端rdebug -c。

Interesting Posts