Go连接LDAP服务
通过go操作的ldap,这里使用到的是go-ldap包,该包基本上实现了ldap v3的基本功能. 比如连接ldap服务、新增、删除、修改用户信息等,支持条件检索的ldap库中存储的数据信息。
下载
go get github.com/go-ldap/ldap/v3
go get github.com/wxnacy/wgo/arrays
使用go-ldap包,可以在gopkg.in/ldap.v3@v3.1.0#section-readme查看说明文档
准备LDAP环境
这里通过docker-compose
运行一个临时的ldap实验环境,
version: "3"
services:
ldap:
image: osixia/openldap:latest
container_name: openldap
hostname: openldap
restart: always
environment:
- "LDAP_ORGANISATION=devopsman"
- "LDAP_DOMAIN=devopsman.cn"
- "LDAP_BASE_DN=dc=devopsman,dc=cn"
- "LDAP_ADMIN_PASSWORD=admin123"
ports:
- 389:389
- 636:636
可以按需修改对应的环境变量信息.可以在hub.docker.com找到指定版本的镜像信息. 现在创建一下openldap并且检查一下服务的是否正常:
GO-LDAP案例实践
创建用户
在pkg.go.dev文档中查看,有一个Add
方法可以完成创建用户的操作,但是需要一个AddRequest
参数,而NewAddRequest
方法可以返回AddRequest
,于是按照此思路梳理一下。
- 首先要建立与openldap之间的连接,验证账号是否正常,同时此账号要有创建的权限。
// LoginBind connection ldap server and binding ldap server
func LoginBind(ldapUser, ldapPassword string) (*ldap.Conn, error) {
l, err := ldap.DialURL(ldapURL)
if err != nil {
return nil, err
}
_, err = l.SimpleBind(&ldap.SimpleBindRequest{
Username: fmt.Sprintf("cn=%s,dc=devopsman,dc=cn", ldapUser),
Password: ldapPassword,
})
if err != nil {
fmt.Println("ldap password is error: ", ldap.LDAPResultInvalidCredentials)
return nil, err
}
fmt.Println(ldapUser,"登录成功")
return l, nil
}
- 其次,创建用户,需要准备用户的姓名、密码、sn、uid、gid等信息,可以创建一个
struct
结构
type User struct {
username string
password string
telephone string
emailSuffix string
snUsername string
uid string
gid string
}
通过go-ldap包提供的NewAddRequest
方法,可以返回新增请求
func (user *User) addUser(conn *ldap.Conn) error {
ldaprow := ldap.NewAddRequ