10

これは単純に奇妙です。

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

ログにエラーはありません。すべてがうまくいくようです。「cheap debugging」別名 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 をデバッグする良い方法はありますか?

4

2 に答える 2

12

他の誰かがこれに出くわした場合に備えて、問題は次のとおりです。

Warden Strategiesによると:

有効?

有効な?メソッドは戦略のガードとして機能します。有効な? を宣言するのはオプションです。メソッドを宣言しない場合、戦略は常に実行されます。ただし、宣言した場合、その戦略は #valid? の場合にのみ試行されます。true と評価されます。

上記の戦略は、「ユーザー名」または「パスワード」パラメーターのいずれかがある場合、ユーザーがログインしようとしていると推論しています。そのうちの 1 つしかない場合、'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!メソッドが呼び出されます。

于 2011-09-06T18:38:07.660 に答える
3

私は同様の問題に遭遇しました。デバッグの短いセッションの後、私はその理由を見つけました。私のユーザーは確認されていないため、私の戦略で最初にサインインに成功した後、確認可能なモジュールである次のモジュールのいずれかによってログアウトされました:)

ところで、Rails アプリケーションをデバッグする最も簡単な方法は、次のコードを使用することです。

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

次に、端末から rdebug -c を実行します。

于 2010-12-22T14:57:11.193 に答える