【问题标题】:Devise ignoring custom strategy设计忽略自定义策略
【发布时间】:2011-03-31 01:12:06
【问题描述】:

这简直太奇怪了。

我已经安装了 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

我的日志中没有错误。一切似乎都正常。如果我添加“廉价调试”,也就是一堆 puts 语句,它似乎反映了 :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 的好方法?

【问题讨论】:

  • 我看到了同样的事情。有没有想过这个?
  • 我一直无法弄清楚,所以我转向了不同的方向。我所做的所有调试使它看起来可以正常调试,但实际上并没有工作。

标签: ruby-on-rails kerberos devise


【解决方案1】:

如果其他人遇到这种情况,我认为问题出在以下几点:

根据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! 方法。

【讨论】:

    【解决方案2】:

    我遇到了类似的问题。经过短暂的调试后,我找到了原因。我的用户未得到确认,因此在使用我的策略初始成功登录后,他被以下可确认模块之一注销:)

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

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

    然后从终端 rdebug -c。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-12
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 2015-10-16
      • 2011-11-22
      • 2020-07-01
      • 2011-05-12
      相关资源
      最近更新 更多