什么是go ldap连接
发表于:2025-11-16 作者:千家信息网编辑
千家信息网最后更新 2025年11月16日,本篇内容主要讲解"什么是go ldap连接",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"什么是go ldap连接"吧!ldap连接// LdapConn
千家信息网最后更新 2025年11月16日什么是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安全错误
数据库的锁怎样保障安全
小米打电话时提示服务器出错
台州云软件开发计划
如何找到冰原守卫者服务器
论文数据库表的设计
重庆开县蔬菜批发软件开发
江苏通信软件开发服务
工行软件开发中心 公司
河南健康档案信息管理系统服务器
网络安全的现实性与社会性
怎么制作文件服务器
四川华为服务器维修调试价格
软件开发管理项目要点
软件开发网络工程学哪个学校好
中信建投证券招软件开发
宜兴品质网络技术联系方式
银行生产和办公网络安全要求
合肥直播软件开发多少钱
北京超频服务器报价
株洲网络安全系统哪家好
歌尔eea事业部软件开发
清道夫保护网络安全
网吧网络安全许可证多长时间
dlc数据库
深圳市黑石互联网科技公司
网络安全保护制度的重要性
广州诗悦网络技术有限公司
网络安全设备采购报告
30tb服务器
数据库外键关系的影响
单位网络安全试题及答案