Я разрабатываю пользовательскую стратегию для аутентификации LDAP, и я внедрил методы valid?
и authenticate!
в соответствии с http://kyan.com/blog/2013/10/11/devise-authentication-strategies и этим устройством wiki. Моя пользовательская стратегия работает сама по себе.Разработка закладок и пользовательская стратегия
Я также хочу использовать модуль Lockable (и другие модули Devise), но они, похоже, работают только тогда, когда также присутствует Database_Authenticatable. Я читал исходный код Devise, но я не понимаю, как Lockable может найти пользователя (ресурс), чтобы увеличить счет: failed_attempts. Как передать пользовательскую запись или ресурс блокировки с помощью моей собственной стратегии?
Моя пользовательская стратегия ниже. Я использую Devise 3.5 и Rails 4.2
require 'net/ldap'
require 'devise/strategies/authenticatable'
module Devise
module Strategies
class LdapAuthenticatable < Authenticatable
def valid?
params[:user] && login.present? && password.present?
end
def authenticate!
resource = mapping.to.find_for_authentication(email: params[:user][:email])
if params[:user]
begin
ldap = Net::LDAP.new
ldap.auth(my_ldap_service, my_ldap_service_password)
ldap.encryption(:simple_tls)
ldap.base = "base_here"
ldap.host = my_ldap_host
ldap.port = "636"
result_attrs = ["employeenumber", "givenname", "sn", "mail", "department"]
result = ldap.bind_as(base: "base_here", filter: "(mail=#{login})", attributes: result_attrs, password: password, time: 3)
if result
#valid ldap credentials
user = get_user_from_database(result)
if user
success!(user)
else
fail!(:invalid_login)
end
else
fail!(:invalid_login)
end
rescue => e
Rails.logger.error e.message
fail!(:invalid_login)
end
end
end
def login
params[:user][:email]
end
def password
params[:user][:password]
end
end
end
end