2016-01-12 1 views
0

Я разрабатываю пользовательскую стратегию для аутентификации 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 

ответ

0

Active Directory должен позаботиться о возможности блокировки. Используя LDAP в своей пользовательской стратегии, вы переносите ответственность за эту функцию из своего приложения в LDAP/Active Directory. Запираемый должен помешать злодею от прямого доступа к вашему приложению. Если у Active Directory не было никаких ограничений на это, он мог бы просто запустить свою атаку непосредственно против него, а в случае успеха использовать учетные данные в своем приложении.

Однако вы должны включить приложение для отображения сообщений об ошибках, возвращаемых удаленным сервером, например «Слишком много попыток, повторите попытку через 5 минут».

Смежные вопросы