Интеграция Free-IPA Ldap с GO

Я пытаюсь интегрировать FreeIPA с golang с помощью пакета "gopkg.in/ldap.v2", я создал одну роль с именем "test" в пользовательском интерфейсе FreeIPA и попытался найти эту роль

через командную строку:

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.Мой код 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

Может кто-нибудь помочь мне получить это с Голангом.

Примечание: хорошо работает для пользователей и групп.

2 ответа

Вы, вероятно, должны связать, прежде чем начать поиск, используя что-то вроде:

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

Дайте мне знать, как я могу помочь.

Возможно, немного поздно, но если вы ищете API на основе HTTP (как вы, похоже, делаете в одном из комментариев к ответу), вы можете посмотреть следующую статью:

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

На самом деле существует очень полный API-интерфейс JSON-RPC, доступный через HTTP. Статья, приведенная выше, дает пример того, как ее использовать. Вооружившись браузером API, включенным в графический интерфейс FreeIPA, вы сможете использовать HTTP-клиент в Go для кодирования своих собственных функций.

За исключением того, что у GitHub есть две потенциальные библиотеки для вас:

Первый реализует только несколько функций, но их может быть достаточно для ваших нужд. Другой генерируется автоматически, но я не знаю, насколько хорош результат.

Обратите внимание, что я не использовал ни один, так что я не могу командовать их удобством использования.

Другие вопросы по тегам