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,暫時只用到了這麼多,希望能對後來者有所幫助吧,義薄雲天~