本篇内容主要讲解“什么是go ldap连接”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是go 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 实例化一个 ldapConn func 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 }
// 查询所有用户
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连接”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
Copyright © 2009-2022 www.fjjierui.cn 青羊区广皓图文设计工作室(个体工商户)达州站 版权所有 蜀ICP备19037934号