如何使用 Golang 向 LDAP 服务器添加新条目?

How to add new entry to LDAP server with Golang?

我在尝试将新条目添加到我的 LDAP 服务器时遇到问题。我得到的错误如下:LDAP 结果代码 65 "Object Class Violation":未提供结构对象 class。如果有人能告诉我一些原因,那会很有帮助。

我绑定到服务器,所以看起来我只是对实际的条目属性有问题..但我不确定在哪里修复它。

package main

import (
  "fmt"
//  "github.com/go-ldap/ldap"
  "gopkg.in/ldap.v2"
  "log"
)

//List of constants
const (
  host = "127.0.0.1"
  port = "389"
  hostPort = host + ":" + port
  userID = "cn=admin,dc=test123,dc=com"
  password = "password"
)

//Main function to be called
func main() {
  addEntries()
}

//Add entries function
func addEntries(){
  fmt.Println("Adding started")

  //Initialize connection
  l, err := ldap.Dial("tcp", hostPort)

  if err != nil {
    log.Fatal(err)
  }
  defer l.Close()

  //Bind to the LDAP server
  bindusername := "cn=admin,dc=test123,dc=com"
  bindpassword := "password"

  err = l.Bind(bindusername, bindpassword)
  if err != nil {
    log.Fatal(err)
    return
  }

  fmt.Println("Testing.")

  //Create new Add request object to be added to LDAP server.
  a := ldap.NewAddRequest("ou=groups,dc=test123,dc=com")
  a.Attribute("cn", []string{"gotest"})
  a.Attribute("objectClass" ,[]string{"top"})
  a.Attribute("description", []string{"this is a test to add an entry using golang"})
  a.Attribute("sn" ,[]string{"Google"})

  fmt.Println("Testing.")
  add(a , l)




}
func add(addRequest *ldap.AddRequest , l *ldap.Conn) {
  err := l.Add(addRequest)
  if err != nil {
    fmt.Println("Entry NOT done",err)
  } else {
    fmt.Println("Entry DONE",err)
  }
}

创建 LDAP 对象时最常见的错误是缺少 objectClass and/or 对象的强制属性(例如 uidcn 等)。这里有一些技巧以确定这些要求。


您可以像这样查询 LDAP 服务器的架构:

ldapsearch -x -h my.example.com -b "cn=schema" -s base "(objectclass=*)"

输出不是很容易阅读,但如果您知道 objectClass 您正在寻找的确切内容,事情就会变得更清楚一些。

例如 objectClass: person 定义可能如下所示:

objectClasses: ( 2.5.6.6 NAME 'person' DESC 'Defines entries that generically
 represent people.' SUP top STRUCTURAL MUST ( cn $ sn ) MAY ( description $ se
 eAlso $ telephoneNumber $ userPassword ) )

因此您可以看到这是一个 STRUCTURAL objectClass(补充 top),如果要创建这样一个 person LDAP 对象,它:

  • 必须包括:cnsn
  • 和可选:descriptionseeAlsotelephoneNumberuserPassword

个别属性类型定义如下:

attributeTypes: ( 2.5.4.3 NAME ( 'cn' 'commonName' ) DESC 'This is the X.500 c
 ommonName attribute, which contains a name of an object.  If the object corre
 sponds to a person, it is typically the persons full name.' SUP 2.5.4.41 EQUA
 LITY 2.5.13.2 ORDERING 2.5.13.3 SUBSTR 2.5.13.4 )