什么是go ldap连接
发表于:2025-02-21 作者:千家信息网编辑
千家信息网最后更新 2025年02月21日,本篇内容主要讲解"什么是go ldap连接",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"什么是go ldap连接"吧!ldap连接// LdapConn
千家信息网最后更新 2025年02月21日什么是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安全错误
数据库的锁怎样保障安全
服务器能装外置无线网卡吗
数据库将年龄加一
数据库输入不了怎么办
网页游戏需要哪些服务器
20cn网络安全小组简介
嘉兴金泉网络技术有限公司
数据库三个安全
数据库中表的组成内容包括
修改数据库路径
服务器改流媒体
网络电视连接的服务器
软件开发上线周期的描述
红歌网络技术有限公司
什么软件开发web
数据库关系结构化模式
托克托县网络安全
道夫软件开发
海尔软件开发好进吗
踢死服务器
phpmysql数据库
aws服务器 aws 公钥
山东青岛卓尔软件开发
视频文件存在什么数据库
远程心电网络技术操作目的
定位软件开发原理
数据库免费视频
数据库安全与权限授予分析
金山区品牌软件开发服务电话
广西手机软件开发工具
南京智慧学校软件开发