-1

我正在尝试使用包“gopkg.in/ldap.v2”将 FreeIPA 与 golang 集成,我在 FreeIPA UI 中创建了一个名为“test”的角色并尝试搜索该角色

通过命令行:

ldapsearch -D "cn=目录管理器" -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))"

输出:

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

我正在尝试将其与我的 go 代码集成。 我的代码是:

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)
}

不幸的是,我在sr.Entries中得到了空条目

有人可以帮我用golang得到这个。

注意:它对用户工作正常。

4

2 回答 2

0

您“可能”需要在开始搜索之前使用以下内容进行绑定

// 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,
    )

让我知道我能提供什么帮助。

于 2017-07-12T13:47:37.467 回答
0

也许有点晚了,但是如果您正在寻找基于 HTTP 的 API(正如您在答案的评论之一中所做的那样),您可以查看以下文章:

http://www.admin-magazine.com/Archive/2016/34/A-REST-interface-for-FreeIPA

实际上有一个非常完整的 JSON-RPC API 可以通过 HTTP 访问。上面链接的文章给出了如何使用它的示例。借助 FreeIPA GUI 中包含的 API 浏览器,您应该能够在 Go 中使用 HTTP 客户端来编写您自己的函数。

除非 GitHub 为您提供两个潜在的库:

第一个只实现了几个功能,但这些可能足以满足您的需求。另一个是自动生成的,但我不知道结果有多好。

请注意,我都没有使用过,所以我无法控制它们的可用性。

于 2018-10-19T21:40:18.463 回答