Golang-LDAP

本文不介绍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)
}

你可能感兴趣的:(Golang-LDAP)