什么是go ldap连接
发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,本篇内容主要讲解"什么是go ldap连接",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"什么是go ldap连接"吧!ldap连接// LdapConn
千家信息网最后更新 2026年11月04日什么是go ldap连接
本篇内容主要讲解"什么是go ldap连接",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"什么是go ldap连接"吧!
ldap连接
// LdapConn LDAP服务器连接配置type LdapConn struct { gorm.Model // 连接地址 ConnUrl string `json:"conn_url" gorm:"type:varchar(255);unique_index;not null;comment:连接地址 逻辑外键"` // SSL加密方式 SslEncryption bool `json:"ssl_encryption" gorm:"type:tinyint;length:1;comment:SSL加密方式"` // 超时设置 Timeout time.Duration `json:"timeout" gorm:"type:int;comment:超时设置"` // 根目录 BaseDn string `json:"base_dn" gorm:"type:varchar(255);not null;comment:根目录"` // 用户名 AdminAccount string `json:"admin_account" gorm:"type:varchar(255);not null;comment:用户名"` // 密码 Password string `json:"password" gorm:"type:varchar(255);not null;comment:密码"`}type LdapAttributes struct { // ldap字段 Num string `json:"employeeNumber" gorm:"type:varchar(100);unique_index"` // 工号 Sam string `json:"sAMAccountName" gorm:"type:varchar(128);unique_index"` // SAM账号 Dn string `json:"distinguishedName" gorm:"type:varchar(100);unique_index"` // dn AccountCtl string `json:"UserAccountControl" gorm:"type:varchar(100);unique_index"` // 用户账户控制 Expire string `json:"accountExpires" gorm:"type:varchar(100);unique_index"` // 账户过期时间 PwdLastSet string `json:"pwdLastSet" gorm:"type:varchar(100);unique_index"` // 用户下次登录必须修改密码 WhenCreated string `json:"whenCreated" gorm:"type:varchar(100);unique_index"` // 创建时间 WhenChanged string `json:"whenChanged" gorm:"type:varchar(100);unique_index"` // 修改时间 DisplayName string `json:"displayName" gorm:"type:varchar(32);unique_index"` // 真实姓名 Sn string `json:"sn" gorm:"type:varchar(100);unique_index"` // 姓 Name string `json:"name" gorm:"type:varchar(100);unique_index"` // 姓名 GivenName string `json:"givenName" gorm:"type:varchar(100);unique_index"` // 名 Email string `json:"mail" gorm:"type:varchar(128);unique_index"` // 邮箱 Phone string `json:"mobile" gorm:"type:varchar(32);unique_index"` // 移动电话 Company string `json:"company" gorm:"type:varchar(128);unique_index"` // 公司 Depart string `json:"department" gorm:"type:varchar(128);unique_index"` // 部门 Title string `json:"title" gorm:"type:varchar(100);unique_index"` // 职务}var attrs = []string{ "employeeNumber", // 工号 "sAMAccountName", // SAM账号 "distinguishedName", // dn "UserAccountControl", // 用户账户控制 "accountExpires", // 账户过期时间 "pwdLastSet", // 用户下次登录必须修改密码 "whenCreated", // 创建时间 "whenChanged", // 修改时间 "displayName", // 显示名 "sn", // 姓 "name", "givenName", // 名 "mail", // 邮箱 "mobile", // 手机号 "company", // 公司 "department", // 部门 "title", // 职务}// Init 实例化一个 ldapConnfunc Init(c *LdapConn) *LdapConn { return &LdapConn{ ConnUrl: c.ConnUrl, SslEncryption: c.SslEncryption, Timeout: c.Timeout, BaseDn: c.BaseDn, AdminAccount: c.AdminAccount, Password: c.Password, }}// 获取ldap连接func NewLdapConn(conn *LdapConn) (l *ldap.Conn, err error) { // 建立ldap连接 l, err = ldap.DialURL(conn.ConnUrl) // 设置超时时间 l.SetTimeout(time.Duration(conn.Timeout)) if err != nil { log.Log().Error("dial ldap url failed,err:%v", err) return } // defer l.Close() // 重新连接TLS err = l.StartTLS(&tls.Config{InsecureSkipVerify: true}) if err != nil { log.Log().Error("start tls failed,err:%v", err) return } // 首先与只读用户绑定 err = l.Bind(conn.AdminAccount, conn.Password) if err != nil { log.Log().Error("admin user auth failed,err:%v", err) return } return}查询ldap用户
// 查询所有用户func FetchLdapUsers(conn *LdapConn) (LdapUsers []*LdapAttributes) { ldap_conn, err := NewLdapConn(conn) // 建立ldap连接 if err != nil { log.Log().Error("setup ldap connect failed,err:%v\n", err) } defer ldap_conn.Close() searchRequest := ldap.NewSearchRequest( conn.BaseDn, // 待查询的base dn ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false, "(objectclass=user)", // 过滤规则 attrs, // 待查询属性列表 nil, ) sr, err := ldap_conn.Search(searchRequest) if err != nil { log.Log().Error("查询用户出错:%v", err) } for _, entry := range sr.Entries { LdapUsers = append(LdapUsers, &LdapAttributes{ Num: entry.GetAttributeValue("employeeNumber"), Sam: entry.GetAttributeValue("sAMAccountName"), Dn: entry.GetAttributeValue("distinguishedName"), AccountCtl: entry.GetAttributeValue("UserAccountControl"), Expire: entry.GetAttributeValue("accountExpires"), PwdLastSet: entry.GetAttributeValue("pwdLastSet"), WhenCreated: entry.GetAttributeValue("whenCreated"), WhenChanged: entry.GetAttributeValue("whenChanged"), DisplayName: entry.GetAttributeValue("displayName"), Sn: entry.GetAttributeValue("sn"), Name: entry.GetAttributeValue("name"), GivenName: entry.GetAttributeValue("givenName"), Email: entry.GetAttributeValue("mail"), Phone: entry.GetAttributeValue("mobile"), Company: entry.GetAttributeValue("company"), Depart: entry.GetAttributeValue("department"), Title: entry.GetAttributeValue("title"), }, ) } return}测试方法 go test下可以输出查询到的用户信息
// func TestLdapConn(t *testing.T) {// conn := Init(// &LdapConn{// ConnUrl: "ldap://192.168.6.66:389",// BaseDn: "OU=赢麻了,DC=YML,DC=com",// AdminAccount: "CN=Administrator,CN=Users,DC=YML,DC=com",// Password: "tasdfjyml556sbsdf",// SslEncryption: false,// Timeout: 5 * time.Second,// })// users := FetchLdapUsers(conn)// for _, user := range users {// fmt.Println(user)// break// }// }新增用户
// 批量新增用户 (AddLdapUsersRes []bool)func AddLdapUsers(conn *model.LdapConn, LdapUsers []*LdapAttributes) (AddLdapUsersRes []bool) { ldap_conn, err := NewLdapConn(conn) // 建立ldap连接 if err != nil { log.Log().Error("setup ldap connect failed,err:%v\n", err) } defer ldap_conn.Close() // 批量处理 for _, user := range LdapUsers { addReq := ldap.NewAddRequest("CN="+user.DisplayName+user.Sam+","+conn.BaseDn, nil) // 指定新用户的dn 会同时给cn name字段赋值 addReq.Attribute("objectClass", []string{"top", "organizationalPerson", "user", "person"}) // 必填字段 否则报错 LDAP Result Code 65 "Object Class Violation" addReq.Attribute("employeeNumber", []string{user.Num}) // 工号 暂时没用到 addReq.Attribute("sAMAccountName", []string{user.Sam}) // 登录名 必填 addReq.Attribute("UserAccountControl", []string{user.AccountCtl}) // 账号控制 544 是启用用户 // addReq.Attribute("accountExpires", []string{user.Expire}) // 账号过期时间 当前时间加一个时间差并转换为NT时间 addReq.Attribute("pwdLastSet", []string{user.PwdLastSet}) // 用户下次登录必须修改密码 0是永不过期 addReq.Attribute("displayName", []string{user.DisplayName}) // 真实姓名 某些系统需要 addReq.Attribute("sn", []string{user.Sn}) // 姓 addReq.Attribute("givenName", []string{user.GivenName}) // 名 addReq.Attribute("mail", []string{user.Email}) // 邮箱 必填 addReq.Attribute("mobile", []string{user.Phone}) // 手机号 必填 某些系统需要 addReq.Attribute("company", []string{user.Company}) addReq.Attribute("department", []string{user.Depart}) addReq.Attribute("title", []string{user.Title}) if err = ldap_conn.Add(addReq); err != nil { if ldap.IsErrorWithCode(err, 68) { log.Log().Error("User already exist: %s", err) } else { log.Log().Error("User insert error: %s", err) } AddLdapUsersRes = append(AddLdapUsersRes, false) return } AddLdapUsersRes = append(AddLdapUsersRes, true) } return}测试 可以批量创建
func TestAddLdapUsers(t *testing.T) { conn := Init( &model.LdapConn{ ConnUrl: "ldap://192.168.6.66:389", BaseDn: "OU=上海总部,OU=赢麻了科技,DC=YML,DC=com", AdminAccount: "CN=Administrator,CN=Users,DC=YML,DC=com", Password: "tasdfjyml556sbsdf", SslEncryption: false, Timeout: 5 * time.Second, }) var LdapUsers []*LdapAttributes = make([]*LdapAttributes, 0, 5) LdapUsers = append(LdapUsers, &LdapAttributes{ Dn: "CN=" + "张三" + "2333" + "," + conn.BaseDn, // dn Num: "2333", // 工号 Sam: "2333", AccountCtl: "544", Expire: "1", PwdLastSet: "0", DisplayName: "张三", Sn: "张", GivenName: "三", Email: "2333yml@qq.com", Phone: "1583456789", Company: "赢麻了科技", Depart: "财务部", Title: "牛魔王", }) LdapUsers = append(LdapUsers, &LdapAttributes{ Dn: "CN=" + "王五" + "2555" + "," + conn.BaseDn, // dn Num: "2555", // 工号 Sam: "2555", AccountCtl: "544", Expire: "1", PwdLastSet: "0", DisplayName: "王五", Sn: "张", GivenName: "五", Email: "25555yml@qq.com", Phone: "1583455555", Company: "赢麻了科技", Depart: "财务部", Title: "蝎子精", }) res := AddLdapUsers(conn, LdapUsers) for index, r := range res { fmt.Println(index, r) }}结果
到此,相信大家对"什么是go ldap连接"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
用户
时间
查询
密码
工号
账号
账户
登录
姓名
字段
科技
邮箱
控制
公司
内容
地址
手机
手机号
方式
方法
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网科技
互联网科技公司起名
科技和互联网公司
疫情对互联网科技公司影响
广州互联网科技公司
上海互联网科技有限公司
万易互联网科技
凡科互联网科技
万达互联网科技
丰台科技园 互联网公司
华脉科技工业互联网产品
华服互联网科技官网
广西互联网科技孵化中心
富国互联网科技002692
信承诺互联网科技有限公司
萌小萌互联网科技河南有限公司
第三届互联网大会安防黑科技
现代互联网科技公司
10位科技互联网大佬
宁波允成互联网科技有限公司
互联网科技集团
广州善班互联网科技
富国互联网科技创新基金
互联网科技研发水平
阿里互联网科技企业
互联网科技大赛获奖感言
滨湖区互联网智能科技产品有哪些
山东子淼互联网科技有限公司
互联网高科技行业有哪些企业
中国主要互联网科技公司