Golang连接ldap校验ldap user

该博客介绍了如何使用Go语言的go-ldap库实现 LDAP 用户身份验证。首先,通过配置文件读取AD服务器的管理员凭证和LDAP URL。然后,使用管理员账户建立连接并进行第一次Bind。接着,搜索指定用户的DN,并尝试使用用户的DN和密码进行第二次Bind来验证其身份。如果第二次Bind成功,表明用户身份验证通过。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第三方包go-ldap
方法文档go-ldap docs
实现方法

  1. 使用管理员账户密码进行Bind
  2. 根据要验证的用户名查找DN
  3. 使用要验证的用户DN和密码进行第二次Bind

核心代码:userAuth.go

package ldap

import (
	"crypto/tls"
	"fmt"
	"github.com/go-ldap/ldap/v3"
	"gopkg.in/ini.v1"
)

func UserAuthentication(user, pass string) error {
	filePath := "./config/config.ini"
	cfg, err := ini.Load(filePath)
	if err != nil {
		fmt.Printf("Fail to read file: %v\n", err)
		return err
	}
	username = cfg.Section("AdServer").Key("Username").String()
	password = cfg.Section("AdServer").Key("Password").String()
	ldapUrl  = cfg.Section("AdServer").Key("LdapUrl").String()
	DN 		 = cfg.Section("OrganizationalUnit").Key("BaseDN").String()

	// tls 认证
	tlsConfig := &tls.Config{InsecureSkipVerify: true}
	l, err := ldap.DialTLS("tcp", ldapUrl, tlsConfig)
	if err != nil {
		return err
	}
	defer l.Close()

	// 用户 bind,这个要bind一个具有域控管理的账号
	err = l.Bind(username, password)
	if err != nil {
		return err
	}

	// 1. 先对用户进行搜索,是否在ldap中
	filter := fmt.Sprintf("(&(objectClass=person)(sAMAccountName=%s))", user)
	searchRequest := ldap.NewSearchRequest(
		DN,
		ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false,
		//fmt.Sprintf("(&(objectClass=organizationalUnit))"),
		filter,
		[]string{"cn"},
		nil,
	)
	sr, err := l.Search(searchRequest)
	if err != nil {
		return err
	}

	// 2. 进行二次bind,验证用户pass是否正确
	userDN := sr.Entries[0].DN
	err = l.Bind(userDN, pass)
	if err != nil {
		return err
	}

	return nil
}

config.ini

[AdServer]
Username = rsq
Password = 123456
LdapUrl = 192.168.1.1:636

[OrganizationalUnit]
BaseDN = DC=rsq,DC=local

参考文章:使用go获取LDAP的baseDN以及验证登录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RSQ博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值