设计忽略自定义策略
这实在是太奇怪了。
我已经安装了 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 语句),则似乎反映出 :kerb 策略是默认策略。以下是登录尝试的一组日志示例:
=> 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?
This is just plain weird.
I've got Rails 3 RC running with Devise installed. I've defined a custom strategy to try and use Kerberos for authentication.
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
I have the Devise Warden configuration setup as follows:
config.warden do |manager|
manager.strategies.add(:kerb, Devise::Strategies::Kerb)
manager.default_strategies :kerb
end
I get no errors in my log. Everything seems to work ok. If I add "cheap debugging" aka a bunch of puts statements, it seems to reflect that the :kerb strategy is the default. Here is a sample set of logs from a login attempt:
=> 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)
The kerberos code works in other things on the same machine. I was sort of expecting it to show a bunch of errors if there was a problem but I am getting nothing. Is there a good way to debug Devise/Warden?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
如果其他人遇到这个问题,我认为问题是这样的:
根据Warden Strategies:
所以你的有效方法:
它返回 false,因此永远不会调用
authenticate!
。params
是一个嵌套哈希,因此应该是params[:user][:username]
而不是params[:username]
。将您的有效方法更改为:
将返回 true 并导致调用
authenticate!
方法。In case someone else comes across this, here's what I believe the problem is:
According to Warden Strategies:
So your valid method:
It's returning false, so the
authenticate!
is never called.params
is a nested hash, so it should beparams[:user][:username]
instead ofparams[:username]
.Changing your valid method to:
will return true and cause the
authenticate!
method to be called.我遇到了类似的问题。经过短暂的调试,我找到了原因。我的用户未得到确认,因此在使用我的策略初次成功登录后,他被以下可确认模块之一注销:)
顺便说一句,调试 Rails 应用程序的最简单方法是使用以下代码:
然后使用 rdebug -c 来自终端。
I have run into a similar problem. After a short session of debugging I found out the reason. My user was not confirmed, so after initial successful signing in with my strategy, he was logged out by one of the following modules which is confirmable module :)
Btw, the easiest way to debug rails application is to use following code:
and then rdebug -c from terminal.