覆盖Rails has_secure_password的authenticate方法

时间:2015-11-24 18:59:00

标签: ruby-on-rails ruby authentication

我正在使用自定义用户数据库与has_secure_password和活动目录的组合进行身份验证。如果用户被标记为Active Directory用户,那么我将针对AD进行身份验证,否则针对数据库进行身份验证。

我想覆盖has_secure_password的{​​{1}}方法来反映这一点。

我知道我可以在控制器中处理它,或者通过调用authenticate的新方法处理它,但更喜欢正确覆盖

有没有办法做这样的事情:

authenticate

1 个答案:

答案 0 :(得分:0)

好吧,我明白了。我需要使用一些猴子补丁作为详细的here。我使用了方法包装部分的建议。

最终结果是:

class User < ActiveRecord::Base
  # Must have either password or be a active directory user
  has_secure_password :validations => false
  validates :active_directory_user, presence: true, unless: :password
  validates :password, presence: true, length: { minimum: 6 }, unless: :active_directory_user
  validates :password_digest, presence: true, unless: :active_directory_user

  # Mokey patch on authenticate to use active directory
  old_autheticate = instance_method(:authenticate)
  define_method(:authenticate) do |pass|
    if self.active_directory_user
      active_directory_auth(pass)
    else
      old_autheticate.bind(self).(pass)
    end
  end

  private
    def active_directory_auth (password)
      domain = "domain"
      ldap = Net::LDAP.new
      ldap.host = '<ad ip>'
      ldap.port = 389
      ldap.auth self.username + "@" + domain, password
      if ldap.bind
        self
      else
        false
      end
    end
end