Разработайте игнорирование пользовательской стратегии - PullRequest
8 голосов
/ 17 августа 2010

Это просто странно.

У меня Rails 3 RC работает с Devise . Я определил собственную стратегию, чтобы попытаться использовать 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?

Ответы [ 2 ]

10 голосов
/ 06 сентября 2011

В случае, если кто-то еще сталкивается с этим, вот, на мой взгляд, проблема:

Согласно Warden Strategies :

действительно?

Действительный?Метод выступает в качестве стража для стратегии.Это необязательно, чтобы объявить действительным?метод, и если вы не объявите его, стратегия всегда будет выполняться.Если вы объявите это, стратегия будет проверена только, если #valid?оценивается как true.

Приведенная выше стратегия заключается в том, что, если есть параметр «username» или «password», то пользователь пытается войти в систему.Если есть только один из них, вызов User.authenticate завершится неудачно, но это все еще была желаемая (действительная) стратегия.

Итак, ваш действительный метод:

def valid?
  params[:username] || params[:password]
end

Он возвращает ложь, поэтому authenticate! никогда не вызывается.params - это вложенный хеш, поэтому он должен быть params[:user][:username] вместо params[:username].

Изменение действительного метода на:

def valid?
  params[:user] && (params[:user][:username] || params[:user][:password])
end

вернет true и приведет к authenticate! метод для вызова.

3 голосов
/ 22 декабря 2010

Я столкнулся с подобной проблемой.После короткого сеанса отладки я выяснил причину.Мой пользователь не был подтвержден, поэтому после первоначального успешного входа в мою стратегию он был отключен одним из следующих модулей, который является подтверждающим модулем :)

Кстати, самый простой способ отладки приложения rails - использоватьследующий код:

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

и затем rdebug -c с терминала.

...