Интеграция 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 есть две потенциальные библиотеки для вас:
Первый реализует только несколько функций, но их может быть достаточно для ваших нужд. Другой генерируется автоматически, но я не знаю, насколько хорош результат.
Обратите внимание, что я не использовал ни один, так что я не могу командовать их удобством использования.