about summary refs log tree commit diff
path: root/lib/devise/ldap_authenticatable.rb
blob: 6903d468dc4958a8d2cf504f626e3f3871591be4 (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
50
51
52
53
54
55
# frozen_string_literal: 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: tls_options,
            },
            auth: {
              method: :simple,
              username: Devise.ldap_bind_dn,
              password: Devise.ldap_password,
            },
            connect_timeout: 10
          )

          filter = format(Devise.ldap_search_filter, uid: Devise.ldap_uid, email: email)

          if (user_info = ldap.bind_as(base: Devise.ldap_base, filter: filter, password: password))
            user = User.ldap_get_user(user_info.first)
            success!(user)
          else
            return fail(:invalid)
          end
        end
      end

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

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

      def tls_options
        OpenSSL::SSL::SSLContext::DEFAULT_PARAMS.tap do |options|
          options[:verify_mode] = OpenSSL::SSL::VERIFY_NONE if Devise.ldap_tls_no_verify
        end
      end
    end
  end
end

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