2012-07-11 46 views
2

我正在嘗試重寫使用PHP/MySQL創建的舊應用程序。 使用的認證系統在數據庫中有一個用戶表,用於存儲用戶名,電子郵件等...但不是密碼。使用LDAP和本地數據庫的Rails身份驗證

每當用戶登錄它時,首先檢查數據庫,看看用戶是否存在,如果不存在則返回登錄錯誤。如果用戶存在於本地數據庫中,則它會嘗試使用用戶輸入的用戶名/密碼組合綁定到活動目錄,並在成功時創建會話。

使用Rails完成此操作的最佳方法是什麼?

+0

你問的Rails 4.0+?從文檔中獲得 – Ray301 2014-01-09 21:38:10

回答

3

Ruby's Net :: LDAP庫相當不錯。

下面是我一直在使用它多年的簡化版本:

# sessions_controller.rb 
def create 
    user = User.find_by_login(params[:login]) 
    if user && Ldap.authenticate(params[:login], params[:password]) 
    self.current_user = user 
    Rails.logger.info "Logged in #{user.name}" 
    flash[:notice] = "Successfully Logged In!" 
    redirect_back_or_default root_url 
    else 
    flash[:alert] = "Invalid User credentials" 
    render :new 
    end 
end 

# lib/ldap.rb 
# Ldap.authenticate('user','password') 
# Returns true if validated 
# Returns false if invalidated 
# Returns nil if LDAP unavailable 
require 'net/ldap' 
class Ldap 
    def self.config 
    # this is actually loaded from a yaml config file 
    { 
     :domain => 'YOURDOMAIN', 
     :host => '10.10.10.100' 
    } 
    end 

    def self.authenticate(login, password) 
    conn = Net::LDAP.new(
     :host  => config[:host], 
     :port  => 636, 
     :base  => "dc=#{config[:domain]}, dc=local", 
     :encryption => :simple_tls, 
     :auth  => { 
     :username => "#{login}@#{config[:domain]}.local", 
     :password => password, 
     :method => :simple 
     } 
    ) 
    Timeout::timeout(15) do 
     return conn.bind ? true : false 
    end 
    rescue Net::LDAP::LdapError => e 
    notify_ldap_admin(config[:host],'Error',e) 
    nil 
    rescue Timeout::Error => e 
    notify_ldap_admin(config[:host],'Timeout',e) 
    nil 
    end 

    def self.notify_ldap_admin(host,error_type,error) 
    msg = "LDAP #{error_type} on #{host}" 
    RAILS_DEFAULT_LOGGER.debug(msg) 
    DeveloperMailer.deliver_ldap_failure_msg(msg,error) 
    end 
end 
0
+0

,devise_ldap_authenticable不能與數據庫可驗證模塊一起使用。 – VNarasimhaM 2013-09-18 20:04:19

+0

你可以做到,只需要編寫自己的策略 – spullen 2013-09-19 19:43:02

+0

你能解釋一下嗎?還有另外一個問題需要深入研究嗎? – Ray301 2014-01-09 21:48:48