这简直太奇怪了。
我已经安装了运行Devise的Rails 3 RC。我已经定义了一个自定义策略来尝试使用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
我的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?
答案 0 :(得分:10)
如果遇到其他人,我认为这就是问题所在:
有效?
有效吗?方法充当策略的守卫。声明有效是可选的吗?方法,如果您不声明它,将始终运行策略。如果您确实声明了它,那么只有在#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!
方法。
答案 1 :(得分:3)
我遇到了类似的问题。经过短暂的调试后,我发现了原因。我的用户没有得到确认,所以在我最初成功登录我的策略后,他被以下模块中的一个登出,这是可确认的模块:)
顺便说一下,调试rails应用程序的最简单方法是使用以下代码:
require 'ruby-debug'
Debugger.wait_connection = true
Debugger.start_remote
debugger
然后从终端rdebug -c。