1. 程式人生 > 實用技巧 >golang ldap 學習

golang ldap 學習

就是一個簡單的關於ldap的學習,ldap server 使用了openldap,基於docker 執行

環境準備

  • docker-compose 檔案
version: "3"
services: 
 ldap:
   image: osixia/openldap:latest
   environment:
   - "LDAP_ORGANISATION=dalongrong"
   - "LDAP_DOMAIN=rongfengliang.com"
   - "LDAP_ADMIN_PASSWORD=12sROjpn*^"
   ports: 
   - 389:389
   - 636:636
  • go mod
module myldapapp
go 1.14
require (
  github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 // indirect
  github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d // indirect
  github.com/go-ldap/ldap/v3 v3.2.3 // indirect
  gopkg.in/alecthomas/kingpin.v2 v2.2.6
)
  • main.go
package main
import (
  "fmt"
  "log"
  "gopkg.in/alecthomas/kingpin.v2"
  "github.com/go-ldap/ldap/v3"
)
var (
  ldapaddr     = kingpin.Flag("addr", "ldap addr").Default("127.0.0.1").String()
  ldapport     = kingpin.Flag("port", "ldap connect port").Default("389").Int()
  ldapusername   = kingpin.Flag("username", "ldap connect usernmae").Default("cn=admin,dc=rongfengliang,dc=com").String()
  ldapuserpassword = kingpin.Flag("password", "ldap connect password").Default("12sROjpn*^").String()
  debug      = kingpin.Flag("debug", "run with debug").Default("false").Bool()
)
func main() {
  kingpin.Parse()
  fmt.Printf("%v, %d\n", *ldapaddr, *ldapport)
  con, err := ldap.DialURL(fmt.Sprintf("ldap://%s:%d", *ldapaddr, *ldapport))
  if err != nil {
    log.Fatal("connect err:", err)
   }
  defer con.Close()
  con.Debug.Enable(*debug)
  err = con.Bind(*ldapusername, *ldapuserpassword)
  if err != nil {
    log.Fatal("bind err:", err)
   }
  searchRequest := ldap.NewSearchRequest(
    "dc=rongfengliang,dc=com",
    ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false,
    "(objectClass=*)",
     []string{"dn", "cn", "objectClass"},
    nil,
   )
  searchResult, err := con.Search(searchRequest)
  if err != nil {
    log.Println("can't search ", err.Error())
   }
  log.Printf("%d", len(searchResult.Entries))
  for _, item := range searchResult.Entries {
    item.PrettyPrint(4)
   }
}
  • 程式碼說明
    配置部分基於kingpin,對於ldap 的使用,首先需要connect。然後需要bind(安全),之後就是一些功能操作了(查詢,更新,刪除。。)
  • 執行效果

ldap 資料:

cli 引數:


執行效果:

參考資料

https://github.com/rongfengliang/golang-ldap-learning
https://github.com/go-ldap/ldap
https://github.com/alecthomas/kingpin
https://github.com/osixia/docker-openldap