ldap和数据库的用户身份验证

时间:2013-07-04 07:43:24

标签: devise ruby-on-rails-3.2 ldap

我们计划构建一个利用LDAP和数据库身份验证方式的Rails应用程序。

我们计划采用devise和devise_ldap_authenticatable来实现这一目标。

authlogic可能是这样的,内部使用通过LDAP完成身份验证,但是,外部用户必须首次注册,然后app才能进行数据库身份验证。

我通过谷歌搜索,Devise和devise_ldap_authenticatable不能以组合的方式工作,这里的任何人都有类似的用法,或者其他一些方法来实现它?

提前感谢。

3 个答案:

答案 0 :(得分:1)

我在这里找到一些有价值的链接,但是,我们必须使用不同的模型。

https://groups.google.com/forum/#!topic/plataformatec-devise/-Fnr3LWXxBg

答案 1 :(得分:0)

我已通过以下方式实施双重身份验证。

<强> session_controller.rb

def create

 if (params[:log]=="local")   
           self.resource = warden.authenticate!(:database_authenticatable)

              sign_in(resource_name, resource)
                      yield resource if block_given?
                          respond_with resource, location: after_sign_in_path_for(resource)


                 else

                       
                                   self.resource = warden.authenticate!(:ldap_authenticatable)

                              sign_in(resource_name, resource)
                      yield resource if block_given?
                          respond_with resource, location: after_sign_in_path_for(resource)
                       end

  end

<强> user.rb

  class User < ActiveRecord::Base
      
      devise :ldap_authenticatable, 
:database_authenticatable,:registerable,
            :recoverable, :rememberable, :trackable, :validatable
       

**and view devise/sessions/new.html.erb**


<%= form_for(:user, :url => session_path(:user)) do |f| %>
  <div class="form-inputs">
 <%= f.text_field :username ,:placeholder => "Login id"  %><br> <br>
  <%= f.password_field :password,:placeholder => "Password"  %>




   <label for="check_box_type">Login Server </label><%= select_tag :log, options_for_select([ [" Domain Server","domain"],["Local Server", "local"]])%>


  <%= f.submit 'Sign in' %>

根据用户输入(登录服务器:local / domain),它将登录。

答案 2 :(得分:0)

对SessionsController的略微修改。这首先检查用户是否在本地数据库中。如果不是,则尝试LDAP。无需用户在登录时指定哪种帐户类型。请注意,我的本地数据库有一个已退休和bypass_ldap标志。如果bypass_ldap为false,则必须通过LDAP进行认证。

  def create                                                                                                                                                       
    # If the user has a valid ldap_bypass account                               
    possible_user = User.where(username: params["user"]["username"], bypass_ldap: true, retired: false).first                                  
    if !possible_user.nil? && possible_user.valid_password?(params["user"]["password"])
      self.resource = warden.authenticate!(:database_authenticatable)           
      set_flash_message!(:notice, :signed_in)                                   
      sign_in(resource_name, resource)                                          
      yield resource if block_given?                                            
      respond_with resource, location: after_sign_in_path_for(resource)         
    else                                                                        
      super                                                                     
    end                                                                         
    set_login_token                                                             
  end