您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“什么是go ldap連接”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“什么是go ldap連接”吧!
// LdapConn LDAP服務(wù)器連接配置 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加密方式"` // 超時(shí)設(shè)置 Timeout time.Duration `json:"timeout" gorm:"type:int;comment:超時(shí)設(shè)置"` // 根目錄 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"` // 工號(hào) Sam string `json:"sAMAccountName" gorm:"type:varchar(128);unique_index"` // SAM賬號(hào) 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"` // 賬戶過(guò)期時(shí)間 PwdLastSet string `json:"pwdLastSet" gorm:"type:varchar(100);unique_index"` // 用戶下次登錄必須修改密碼 WhenCreated string `json:"whenCreated" gorm:"type:varchar(100);unique_index"` // 創(chuàng)建時(shí)間 WhenChanged string `json:"whenChanged" gorm:"type:varchar(100);unique_index"` // 修改時(shí)間 DisplayName string `json:"displayName" gorm:"type:varchar(32);unique_index"` // 真實(shí)姓名 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"` // 移動(dòng)電話 Company string `json:"company" gorm:"type:varchar(128);unique_index"` // 公司 Depart string `json:"department" gorm:"type:varchar(128);unique_index"` // 部門(mén) Title string `json:"title" gorm:"type:varchar(100);unique_index"` // 職務(wù) } var attrs = []string{ "employeeNumber", // 工號(hào) "sAMAccountName", // SAM賬號(hào) "distinguishedName", // dn "UserAccountControl", // 用戶賬戶控制 "accountExpires", // 賬戶過(guò)期時(shí)間 "pwdLastSet", // 用戶下次登錄必須修改密碼 "whenCreated", // 創(chuàng)建時(shí)間 "whenChanged", // 修改時(shí)間 "displayName", // 顯示名 "sn", // 姓 "name", "givenName", // 名 "mail", // 郵箱 "mobile", // 手機(jī)號(hào) "company", // 公司 "department", // 部門(mén) "title", // 職務(wù) } // Init 實(shí)例化一個(gè) 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) // 設(shè)置超時(shí)時(shí)間 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)", // 過(guò)濾規(guī)則 attrs, // 待查詢屬性列表 nil, ) sr, err := ldap_conn.Search(searchRequest) if err != nil { log.Log().Error("查詢用戶出錯(cuò):%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 }
測(cè)試方法 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 會(huì)同時(shí)給cn name字段賦值 addReq.Attribute("objectClass", []string{"top", "organizationalPerson", "user", "person"}) // 必填字段 否則報(bào)錯(cuò) LDAP Result Code 65 "Object Class Violation" addReq.Attribute("employeeNumber", []string{user.Num}) // 工號(hào) 暫時(shí)沒(méi)用到 addReq.Attribute("sAMAccountName", []string{user.Sam}) // 登錄名 必填 addReq.Attribute("UserAccountControl", []string{user.AccountCtl}) // 賬號(hào)控制 544 是啟用用戶 // addReq.Attribute("accountExpires", []string{user.Expire}) // 賬號(hào)過(guò)期時(shí)間 當(dāng)前時(shí)間加一個(gè)時(shí)間差并轉(zhuǎn)換為NT時(shí)間 addReq.Attribute("pwdLastSet", []string{user.PwdLastSet}) // 用戶下次登錄必須修改密碼 0是永不過(guò)期 addReq.Attribute("displayName", []string{user.DisplayName}) // 真實(shí)姓名 某些系統(tǒng)需要 addReq.Attribute("sn", []string{user.Sn}) // 姓 addReq.Attribute("givenName", []string{user.GivenName}) // 名 addReq.Attribute("mail", []string{user.Email}) // 郵箱 必填 addReq.Attribute("mobile", []string{user.Phone}) // 手機(jī)號(hào) 必填 某些系統(tǒng)需要 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 }
測(cè)試 可以批量創(chuàng)建
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", // 工號(hào) Sam: "2333", AccountCtl: "544", Expire: "1", PwdLastSet: "0", DisplayName: "張三", Sn: "張", GivenName: "三", Email: "2333yml@qq.com", Phone: "1583456789", Company: "贏麻了科技", Depart: "財(cái)務(wù)部", Title: "牛魔王", }) LdapUsers = append(LdapUsers, &LdapAttributes{ Dn: "CN=" + "王五" + "2555" + "," + conn.BaseDn, // dn Num: "2555", // 工號(hào) Sam: "2555", AccountCtl: "544", Expire: "1", PwdLastSet: "0", DisplayName: "王五", Sn: "張", GivenName: "五", Email: "25555yml@qq.com", Phone: "1583455555", Company: "贏麻了科技", Depart: "財(cái)務(wù)部", Title: "蝎子精", }) res := AddLdapUsers(conn, LdapUsers) for index, r := range res { fmt.Println(index, r) } }
結(jié)果
到此,相信大家對(duì)“什么是go ldap連接”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。