本文不介绍Ldap,仅记录golang连接和操作Ldap
库选择
第三方Ldap库
go get github.com/go-ldap/ldap/v3
// 不少文章使用 go get "gopkg.in/ldap.v3" ,会报错,库已迁移至github
连接
//替换example即可,可在Ldap中查询正确的链接写法
//本文使用Windows Server 2012 Active Directory,打开管理工具 "Active Directory 域和信任关系",左侧目录看到Ldap Url
l, err := ldap.DialURL("ldap://example.com:389")
if err != nil {
log.Fatal(err)
}
defer l.Close()
验证,Ldap允许匿名绑定可忽略此步骤
_, err = l.SimpleBind(&ldap.SimpleBindRequest{
Username: "CN=管理员用户名,cn=Users,DC=example,DC=COM",
Password: "管理员密码",
})
if err != nil {
log.Fatalf("Failed to bind: %s\n", err)
}
查询
searchRequest := ldap.NewSearchRequest(
"dc=szdc,dc=com", // The base dn to search
ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false,
fmt.Sprintf("(&(objectClass=organizationalPerson)"), // 查询所有
//fmt.Sprintf("(&(objectClass=organizationalPerson)(attributes=%s))",value), // 按属性名查询,属性可在Active Directory 域和信任关系 管理工具中的属性编辑器查看
[]string{"dn", "cn"}, // A list attributes to retrieve
nil,
)
sr, err := l.Search(searchRequest)
if err != nil {
log.Fatal(err)
}
fmt.Println(len(sr.Entries)) //查询结果长度
// do something
增删改操作:本Ldap配置未加密链接仅可查询,修改操作需要使用服务器颁发的证书,配置LTS链接,待下篇
以下是全部代码示例,实际生成环境中应用config文件储存配置变量
package ldap
import (
"fmt"
"github.com/go-ldap/ldap/v3"
"log"
)
func ExampleSearch() {
l, err := ldap.DialURL("ldap://example.com:389")
if err != nil {
log.Fatal(err)
}
defer l.Close()
_, err = l.SimpleBind(&ldap.SimpleBindRequest{
Username: "CN=用户名,cn=Users,DC=SZDC,DC=COM",
Password: "密码",
})
if err != nil {
log.Fatalf("Failed to bind: %s\n", err)
}
searchRequest := ldap.NewSearchRequest(
"dc=example,dc=com", // The base dn to search
ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false,
fmt.Sprintf("(&(objectClass=organizationalPerson)(sAMAccountName=%s))","userID"), // The filter to apply
[]string{"dn", "cn"}, // A list attributes to retrieve
nil,
)
sr, err := l.Search(searchRequest)
if err != nil {
log.Fatal(err)
}
fmt.Println(len(sr.Entries))
fmt.Println(len(sr.Entries[0].Attributes))
fmt.Println(sr.Entries[0].Attributes[0].Name)
}