about summary refs log tree commit diff
path: root/lib/devise/ldap_authenticatable.rb
blob: 531abdbbeeb5fd1dc9644fa8acd6eca67eefc273 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# frozen_string_literal: true

if ENV['LDAP_ENABLED'] == 'true'
  require 'net/ldap'
  require 'devise/strategies/authenticatable'

  module Devise
    module Strategies
      class LdapAuthenticatable < Authenticatable
        def authenticate!
          if params[:user]
            ldap = Net::LDAP.new(
              host: Devise.ldap_host,
              port: Devise.ldap_port,
              base: Devise.ldap_base,
              encryption: {
                method: Devise.ldap_method,
                tls_options: OpenSSL::SSL::SSLContext::DEFAULT_PARAMS,
              },
              auth: {
                method: :simple,
                username: Devise.ldap_bind_dn,
                password: Devise.ldap_password,
              },
              connect_timeout: 10
            )

            if (user_info = ldap.bind_as(base: Devise.ldap_base, filter: "(#{Devise.ldap_uid}=#{email})", password: password))
              user = User.ldap_get_user(user_info.first)
              success!(user)
            else
              return fail(:invalid_login)
            end
          end
        end

        def email
          params[:user][:email]
        end

        def password
          params[:user][:password]
        end
      end
    end
  end

  Warden::Strategies.add(:ldap_authenticatable, Devise::Strategies::LdapAuthenticatable)
end