使用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,暂时只用到了这么多,希望能对后来者有所帮助吧,义薄云天~

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