1

これを多次元にするにはどうすればよいですか?各検索結果エントリには複数の属性があります:attributes => ['sAMAccountName','givenName','SN','mail']。結果には多くのエントリが含まれる場合があります。このコードは、複数の属性を持つエントリを 1 つだけ作成する場合に適しています。

  def self.Find(attribute, loginID)
        conn = Net::LDAP.new :host => SERVER,
                             :port => PORT,
                             :base => BASE,
                             :auth => { 
                                         :username => 'admin',
                                         :password => 'admin',
                                         :method => :simple
                                      }
        if  conn.bind
          result = HashWithIndifferentAccess.new
          conn.search( :base => LDAPBASE,
                       :filter => Net::LDAP::Filter.eq( attribute, loginID+"*" ),
                       :attributes => ['sAMAccountName','givenName','SN','mail'],
                       :return_result => true
                      ).each do |entries|
                        entries.each do |attribute, values|
                          values.each do |value|
                            result[attribute] = value
                          end
                        end
                      end
          result
        end
  end

私がldapから得た実際の応答は次のようなものです -

puts result.to_s

{
 "dn"=>"CN=somename\\, somefirstname,OU=Users,DC=site,DC=com", 
 "sn"=>"somename", 
 "givenname"=>"somefirstname",
 "samaccountname"=>"someuserid", 
 "mail"=>"someone@somthing.com"
}

検索には * ワイルドカードがあるため、一致するすべてのエントリを検索します。LDAP は、上記の形式で複数のエントリを返します。これに似た -

    {
      "dn"=>"CN=somename\\, somefirstname1,OU=Users,DC=site,DC=com", 
      "sn"=>"somename1", 
      "givenname"=>"somefirstname1",
      "samaccountname"=>"someuserid1", 
      "mail"=>"someone1@somthing.com"
    },
    {
      "dn"=>"CN=somename\\, somefirstname2,OU=Users,DC=site,DC=com", 
      "sn"=>"somename2", 
      "givenname"=>"somefirstname2", 
      "samaccountname"=>"someuserid2",
      "mail"=>"someone2@somthing.com"
    },
    {
      "dn"=>"CN=somename\\, somefirstname3,OU=Users,DC=site,DC=com",
      "sn"=>"somename3",
      "givenname"=>"somefirstname3",
      "samaccountname"=>"someuserid3", 
      "mail"=>"someone3@somthing.com"
    },


A[a=>1,b=>11,c=>111]
B[a=>2,b=>22,c=>222]
C[a=>3,b=>33,c=>333]
D[a=>4,b=>44,c=>444]
4

1 に答える 1

0

私はその質問を理解したかどうか確信が持てません。

def self.Find(attribute, loginID)
        conn = Net::LDAP.new :host => SERVER,
                             :port => PORT,
                             :base => BASE,
                             :auth => { 
                                         :username => 'admin',
                                         :password => 'admin',
                                         :method => :simple
                                      }
        if  conn.bind
          conn.search( :base => LDAPBASE,
                       :filter => Net::LDAP::Filter.eq( attribute, loginID+"*" ),
                       :attributes => ['sAMAccountName','givenName','SN','mail'],
                       :return_result => true
                      ).reduce(Array.new) do |acc, el|

                         #
                         # Any modification of the entry must be here
                         #

                         acc + [el] 

                      end
          end
        end
end

Array.mapも良い選択だと思います

私の仮定:

  • conn.search return ハッシュの配列
  • 必要な結果の形式:

    [
          {"uid":"123","displayName":"User 123","mail":"123@example.com"},
          {"uid":"456","displayName":"User 456","mail":"456@example.com"},
          {"uid":"789","displayName":"User 789","mail":"789@example.com"}
    ]
    
于 2012-05-01T06:59:57.160 に答える