douzhu3654 2017-07-10 09:43
浏览 86

免费IPA Ldap与GO集成

I am trying FreeIPA integration with golang using package "gopkg.in/ldap.v2", I created one role with name of "test" in FreeIPA UI and tried to search that role

via command line:

ldapsearch -D "cn=directory manager" -w "*****" -p 389 -h "ec2-test.eu-west-1.compute. amazonaws.com" -b "dc=ec2-test,dc=eu-west-1,dc=compute,dc=amazonaws,dc=com" -v -s sub "(&(objectclass=*)(cn=test))"

Output:

ldap_initialize( ldap://ec2-test.eu-west-1.compute.amazonaws.com:389 ) filter: (&(objectclass=*)(cn=test)) requesting: All userApplication attributes
# extended LDIF
#
# LDAPv3
# base <dc=ec2-test,dc=eu-west-1,dc=compute,dc=amazonaws,dc=com> with scope subtree
# filter: (&(objectclass=*)(cn=test))
# requesting: ALL
#

# test, roles, accounts, ec2-test.eu-west-1.compute.amazonaws.com
dn: cn=test,cn=roles,cn=accounts,dc=ec2-test,dc=eu-west-1,dc=compute,dc=amazonaws,dc=com
objectClass: groupofnames
objectClass: nestedgroup
objectClass: top
cn: test
member: uid=gow,cn=users,cn=accounts,dc=ec2-test,dc=eu-west-1,dc=comp  ute,dc=amazonaws,dc=com
member: cn=trov,cn=groups,cn=accounts,dc=ec2-test,dc=eu-west-1,dc=com  pute,dc=amazonaws,dc=com

# search result search: 2 result: 0 Success

# numResponses: 2
# numEntries: 1

I am trying to integrate this with my go code. My go code is:

filterValue := "(&(objectclass="*")(cn="test"))"
searchRequest := ldap.NewSearchRequest(
    baseDN, // The base dn to search
    ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false,
    filterValue, // The filter to apply
    []string{"givenName", "sn", "mail", "uid", "ou", "cn", "dc", "dn"}, // A list attributes to retrieve
    nil,
)
sr, err := ldap.Search(searchRequest)
if err!=nil {
    fmt.Println("Error: , err)
} else {
    fmt.Println("Result: , sr.Entries)
}

Unfortunately I am getting empty entries in sr.Entries

Can someone help me to get this with golang.

Note: Its working fine for users and groups.

  • 写回答

2条回答 默认 最新

  • douchuang1852 2017-07-12 13:47
    关注

    You "probably" need to bind before you start the search using something like:

    // The username and password we want to check
        username := "someuser"
        password := "userpassword"
    
        bindusername := "readonly"
        bindpassword := "password"
    
        l, err := ldap.Dial("tcp", fmt.Sprintf("%s:%d", "ldap.example.com", 389))
        if err != nil {
            log.Fatal(err)
        }
        defer l.Close()
    
        // Reconnect with TLS
        err = l.StartTLS(&tls.Config{InsecureSkipVerify: true})
        if err != nil {
            log.Fatal(err)
        }
    
        // First bind with a read only user
        err = l.Bind(bindusername, bindpassword)
        if err != nil {
            log.Fatal(err)
        }
    
        // Search for the given username
        searchRequest := ldap.NewSearchRequest(
            "dc=example,dc=com",
            ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false,
            fmt.Sprintf("(&(objectClass=organizationalPerson)(uid=%s))", username),
            []string{"dn"},
            nil,
        )
    

    Let me know how I can help.

    评论

报告相同问题?

悬赏问题

  • ¥30 Semantic Kernel + OllamaSharp 集成本地大语言模型
  • ¥15 channels运行加载异常
  • ¥15 用C语言实现语音的读取及播放
  • ¥15 poi怎么在指定位置之后生成多个表格
  • ¥15 nginx在location设置了client_max_body_size依旧报错413
  • ¥15 C#添加WCF服务引用客户端调用方法没有反应
  • ¥15 stm32f103c8t6与esp8266
  • ¥15 使用Hadoop的MapReduce program
  • ¥15 Python发生IndexError错误如何解决?
  • ¥15 如何用matlab搭建激光器