如何使用 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 对象的强制属性(例如 uid
、cn
等)。这里有一些技巧以确定这些要求。
您可以像这样查询 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 对象,它:
- 必须包括:
cn
和 sn
- 和可选:
description
、seeAlso
、telephoneNumber
或 userPassword
个别属性类型定义如下:
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 )
我在尝试将新条目添加到我的 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 对象的强制属性(例如 uid
、cn
等)。这里有一些技巧以确定这些要求。
您可以像这样查询 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 对象,它:
- 必须包括:
cn
和sn
- 和可选:
description
、seeAlso
、telephoneNumber
或userPassword
个别属性类型定义如下:
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 )