我正在使用自定义用户数据库与has_secure_password
和活动目录的组合进行身份验证。如果用户被标记为Active Directory用户,那么我将针对AD进行身份验证,否则针对数据库进行身份验证。
我想覆盖has_secure_password
的{{1}}方法来反映这一点。
我知道我可以在控制器中处理它,或者通过调用authenticate
的新方法处理它,但更喜欢正确覆盖
有没有办法做这样的事情:
authenticate
答案 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