2014-04-25 4 views
0

필자가 작성한 응용 프로그램은 로그인 팝업을 표시하는 기능이 있으며 하드 코딩 된 사용자 이름/암호 상수 쌍에 대해 인증합니다. 우리의 중앙 LDAP 서버에 대해 인증하고 싶습니다. 우리는 base를 가지고 있지 않지만 "cn = USERFOO, ou = it, o = corporate"의 bind_dn 문자열을 가지고 있습니다. 변수 user/pass는 기본 로그인 상자를 통해 전달됩니다.Ruby Webrick HTTPAuth를 LDAP와 함께 사용

ActiveLdap을 통해이 작업을 시도하고 있지만 Webrick Ruby에 완전히 작성된 이후 HTTPAuth를 사용하는 LDAP 서버에 대한 단일 로그온을 통해 자격 증명의 유효성을 검사 할 수 있다면 다른 라이브러리를 사용해도 안됩니다. 아래는 내가 부르고있는 기능의 샘플이다. 누구든지 어떻게하는지 알고 있습니까? 미리 감사드립니다.

def authenticate_ldap(req,res) 
    authlabel = "LDAP Authentication" 
    HTTPAuth.basic_auth(req, res, authlabel) { |user, pass| 
     ActiveLdap::Base.setup_connection(
     :host => 'ldap.internalserver.com', 
     :port => 389, 
     :bind_dn => "cn=#{user},ou=it,o=corporate", 
     :password_block => Proc.new { pass }, 
    ) 
    } 
    return 
end 
+0

실제 질문이 무엇인지는 분명하지 않습니다. – iain

+0

기본적으로 HTTPAuth 또는 다른 비 - 레일 수단을 사용하여 중앙 LDAP 서버에 대해 인증 할 수있는 사용자 이름과 암호를 묻는 팝업 상자를 만들려고합니다. webrick에서 GET/POST를 사용할 수는 있지만 LDAP 서버에 대해 인증하기 위해 라이브러리를 사용하는 데 여전히 어려움을 겪고 있습니다. 문제는 다른 사람들이 사용한 것과이 작업을 수행하기위한 구문입니다. –

+0

위의 코드를 실행하면 어떻게됩니까? 에러 메시지? 시간 초과 ..? – iain

답변

1

해결책을 찾았습니다. LDAP 서버를 관리하는 사람이 잘못된 LDAP 연결 문자열을 제공했지만 그로 인해 여전히 작동하지 않았습니다.

실제로 매우 기본적인 유효성 검사를 통해 연결을 발견 한 솔루션은 순수한 Ruby에서 매우 간단한 LDAP 인증 팝업에 관심이있는 다른 모든 사람들에게이 효과가 있습니다.

def authenticate(req,res) 
    authlabel = 'LDAP Authentication' 
    HTTPAuth.basic_auth(req, res, authlabel) { |user, pass| 
    if pass.to_s != '' 
     ldap = Net::LDAP.new 
     ldap.host = "ldap.serverfoo.com" 
     ldap.port = 389 
     result = ldap.bind_as(
      :base => "t=basetreefoo", 
      :filter => "uid=#{user}", 
      :password => pass 
    ) 
     if result 
     ldap = Net::LDAP.new :host => "ldap.serverfoo.com", 
           :port => "389", 
           :auth => { 
            :method => :simple, 
            :username => "", 
            :password => "" 
           } 

     group_name = Net::LDAP::Filter.eq("cn", "#{user}") 
     group_type = Net::LDAP::Filter.eq("groupmembership", "cn=infra,ou=IT,o=Corporate") 
     filter = group_name & group_type 
     treebase = "t=basetreefoo" 
     ldap.search(:base => treebase, :filter => filter) do |entry| 
      if entry.dn.to_s != "" 
      puts 'success' 
      return 
      end 
     end 
     end 
    end 
    puts 'fail' 
    } 
end