簡體   English   中英

設計忽略自定義策略

[英]Devise ignoring custom strategy

這簡直太奇怪了。

我安裝了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?

如果其他人遇到這個問題,我認為問題是:

根據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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM