Go语言搬砖 ldap统一认证服务

Go语言搬砖 ldap统一认证服务「这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战」。 前言 上一篇文章写了openldap快速入门,这篇来写写相关api的调用 ldap基于go客户端包传送门: https

「这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战」。

前言

上一篇文章写了openldap快速入门,这篇来写写相关api的调用

ldap基于go客户端包传送门: github.com/go-ldap/lda…

该包的功能如下:

  • 支持连接ldap服务器(加密,不加密等)
  • 支持admin和普通用户认证
  • 支持增删改查用户
  • 支持搜索、过滤以及条件查找

安装

先使用go将包下载到本地,因我们使用的openldap目前是v3版本

go get github.com/go-ldap/ldap/v3

在代码编辑器里面引入既可使用

import "github.com/go-ldap/ldap"

使用

连接,管理员认证

调用api的dial来创建一个新实例,后续直接调用

l, err := ldap.Dial("tcp", "IP:389")
if err != nil {
   fmt.Println("连接失败",err)
}
err = l.Bind("cn=admin,dc=libaigo,dc=com", "密码")
if err != nil {
   fmt.Println("管理员认证失败",err)
}

创建用户

这部分第一步先创建用户,接着设置密码,可以用常规的方式设置固定的密码,也可以使用随机生成,这里演示一下随机生成

//创建新用户
addResponse := ldap.NewAddRequest("uid=java1,ou=java,dc=libaigo,dc=com", []ldap.Control{})
addResponse.Attribute("cn",[]string{"java1"})
addResponse.Attribute("sn",[]string{"java1"})
addResponse.Attribute("uid",[]string{"java1"})
addResponse.Attribute("homeDirectory",[]string{"/home/java1"})
addResponse.Attribute("loginShell",[]string{"java1"})
addResponse.Attribute("gidNumber",[]string{"0"})
addResponse.Attribute("uidNumber",[]string{"8001"})
addResponse.Attribute("objectClass",[]string{"shadowAccount","posixAccount","top","inetOrgPerson"})
err = l.Add(addResponse)
if err != nil {
   fmt.Println("创建用户失败")
}

//随机给用户生成密码,并将新密码输出
passwordModifyRequest2 := ldap.NewPasswordModifyRequest("uid=java1,ou=java,dc=libaigo,dc=com", "", "")
passwordModifyResponse2, err := l.PasswordModify(passwordModifyRequest2)
if err != nil {
   fmt.Println(err)
}
generatedPassword  := passwordModifyResponse2.GeneratedPassword
fmt.Println("生成的密码: ",generatedPassword)

普通用户认证

普通用户只有认证权限,没有查询权限

l, err := ldap.Dial("tcp", "IP:389")
if err != nil {
   fmt.Println("连接失败",err)
}

_, err = l.SimpleBind(&ldap.SimpleBindRequest{
   Username: "uid=node1,ou=node1,dc=libaigo,dc=com",
   Password: "node1",
})
if err != nil {
   fmt.Println(err)
}

修改用户信息

修改一些用户的描述之类的,用处不大

modify := ldap.NewModifyRequest("uid=node1,ou=node1,dc=libaigo,dc=com",nil)
modify.Add("description",[]string{"this is test."})
modify.Replace("mail",[]string{"node1@test.com"})

err = l.Modify(modify)

修改用户密码

这个修改密码的函数支持不输入旧密码

passwordModifyRequest := ldap.NewPasswordModifyRequest("uid=go,ou=go,dc=libaigo,dc=com", "", "123456")
//passwordModifyRequest := NewPasswordModifyRequest("", "OldPassword", "NewPassword") //设置新密码
_, err = l.PasswordModify(passwordModifyRequest)
if err != nil {
   fmt.Println("密码不能修改,错误信息: ",err.Error())
}

搜索全部用户

如果没有设置过滤条件,会查找出所有用户

searchRequest := ldap.NewSearchRequest("dc=libaigo,dc=com",
   ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false,
   "(&(objectClass=organizationalPerson))",
   []string{"dn", "cn"}, nil)
search, err := l.Search(searchRequest)
if err != nil {
   fmt.Println(err)
}
for _,entry := range search.Entries {
   fmt.Printf("%s: %v\n", entry.DN, entry.GetAttributeValue("cn"))
}

搜索指定用户

username := "node1"

searchRequest := ldap.NewSearchRequest("dc=libaigo,dc=com",
   ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false,
   fmt.Sprintf("(&(objectClass=organizationalPerson)(uid=%s))", ldap.EscapeFilter(username)),
   []string{"dn"},
   nil, )

sr,err := l.Search(searchRequest)
if err != nil {
   fmt.Println(err)
}

if len(sr.Entries) !=1 {
   fmt.Println("用户不存在或返回条目过多")
}

删除用户

构造一个用户传入到Del函数中既可

err= l.Del(&ldap.DelRequest{
   DN:       "uid=java1,ou=java1,dc=libaigo,dc=com",
   Controls: nil,
})
if err != nil {
   fmt.Println("删除用户错误")
}

今天的文章Go语言搬砖 ldap统一认证服务分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/17338.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注