golang 读取ldap数据库中账户过期时间
2021-11-30 本文已影响0人
東玖零
1.什么是ldap?以下是百科的定义。
轻型目录访问协议(英文:Lightweight Directory Access Protocol,缩写:LDAP,/ˈɛldæp/)是一个开放的,中立的,工业标准的应用协议,通过IP协议提供访问控制和维护分布式信息的目录信息。
我简单的理解就是按规则命名目录一样一层一层的放电脑文件,这些文件可以增删改查,配一张图可能更容易理解。
ldpa.jpeg
2.读取用户的过期时间,直接上代码!
func GetAccountExpired(account string) {
tag := "查询账户过期时间"
l, err := ldap.DialURL("ldap://192.168.0.1:389")
defer l.Close()
if err != nil {
logs.Info(tag, "创建连接失败", err)
return
}
// 域名的部分,其格式是将完整的域名分成几部分,如域名为example.com变成DC=example,DC=com(一条记录的所属位置)
_, err = l.SimpleBind(&ldap.SimpleBindRequest{
Username: "CN=管理员账号,OU=组织,DC=域名",
Password: "管理员密码",
})
if err != nil {
logs.Info(tag, "管理员验证失败", err)
return
}
searchRequest := ldap.NewSearchRequest(
"dc=example,dc=cn", // 域名
ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false,
fmt.Sprintf("(&(objectClass=organizationalPerson)(cn=%s))", account), //cn为查询条件名,开发时改成自己需要的属性名
[]string{"dn", "cn", "accountExpires"}, // 查询字段名,为空则查询所有的属性
nil,
)
sr, err := l.Search(searchRequest)
if err != nil {
logs.Info(tag, "查询失败", err)
return
}
if len(sr.Entries) != 1 {
logs.Info(tag, "查询数据不正确,数据长度", len(sr.Entries))
return
}
cn := sr.Entries[0].GetAttributeValue("cn") // golang读取SearchRequest中的数据
expire := sr.Entries[0].GetAttributeValue("accountExpires")
ntTime, _ := strconv.ParseInt(expire, 10, 64)
ntTime = (ntTime - 1.1644473600125e+17) / 1e+7 // windows时间转换成unix时间
stTime := time.Unix(int64(ntTime), 0).Format("2006-01-02 15:04:05")
logs.Info("cn", cn, "expire", ntTime, "过期时间", stTime)
}