使用go獲取LDAP的baseDN以及驗證登錄

0x0 前言

最近在用go語言連接LDAP做用戶驗證登錄時,發現網上關於使用go獲取LDAP的BaseDN的文章比較少,遇到問題自己到處找了好多天才最終解決,主要所以寫下這篇文章,希望能對其他人有些許借鑑吧~

本文所使用的go庫爲github.com/go-ldap/ldap,ldap爲open ldap。

0x1 獲取BaseDN

BaseDN是LDAP進行檢索的根路徑,檢索將會在這兒開始,一般來說一個LDAP可能只會有一個BaseDN,但是在實際中,我們仍有獲取LDAP BaseDN的需求。獲取BaseDN不需要管理員賬戶密碼。

addr := fmt.Sprintf("%s:%s", config.Address, config.Port)

//addr:127.0.0.1:389

conn, err := ldap.Dial("tcp", addr)

if err != nil {

fmt.Printf("GetBaseDN error:%v\n", err)

return

}

defer conn.Close()

//獲取basedn

search := ldap.NewSearchRequest("", ldap.ScopeBaseObject, ldap.NeverDerefAliases, 0, 0, false, "(objectClass=*)", []string{"namingContexts"}, nil)

sr, err := conn.Search(search)

if err != nil {

fmt.Printf("GetBaseDN error:%v\n", err)

return

}

var resp []*model.BaeDNModel

//一般來說 只有一個屬性namingContexts,因爲Search時設置的只返回namingContexts

if len(sr.Entries) > 0 && len(sr.Entries[0].Attributes) > 0 {

for _, v := range sr.Entries[0].Attributes[0].Values {

var item model.BaeDNModel

item.BaseDN = v

resp = append(resp, &item)

}

}

 

參考文章https://blog.csdn.net/bytxl/article/details/12572937

0x2 用戶驗證

LDAP進行用戶驗證大概需要分爲三步:①使用管理員賬戶密碼進行綁定②根據要驗證的用戶名查找dn③使用要驗證的用戶dn和密碼進行第二次綁定

addr := fmt.Sprintf("%s:%s", m.Address, m.Port)

conn, err := ldap.Dial("tcp", addr)

if err != nil {

ch <- false

return

}

defer conn.Close()

err = conn.Bind(m.Account, m.Password)

if err != nil {

ch <- false

return

}

filter := fmt.Sprintf("(&(%s)(%s=%s))", m.UserFilter, m.UserField, username)

//filter:(&(objectClass=person)(uid=username)) 這地方根據自己的需要自定義

searchRequest := ldap.NewSearchRequest(

m.BaseDN,

ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false,

filter,

[]string{"dn"},

nil,

)

sr, err := conn.Search(searchRequest)

if err != nil {

fmt.Println(err)

ch <- false

return

}



if len(sr.Entries) != 1 {

fmt.Println("search 0 entry")

ch <- false

return

}

userDN := sr.Entries[0].DN

err = conn.Bind(userDN, password)

if err != nil {

fmt.Printf("bind password error:%v\n", err)

ch <- false

return

}

//重新綁定爲只讀的

err = conn.Bind(m.Account, m.Password)

if err != nil {

ch <- false

return

}

ch <- true

}

OK,暫時只用到了這麼多,希望能對後來者有所幫助吧,義薄雲天~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章