49 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			49 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| # 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
 |