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