本篇内容主要讲解“什么是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连接”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/randolphcyg/blog/5042504