溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

什么是go ldap連接

發(fā)布時(shí)間:2021-10-12 09:12:11 來(lái)源:億速云 閱讀:208 作者:iii 欄目:編程語(yǔ)言

本篇內(nèi)容主要講解“什么是go ldap連接”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“什么是go ldap連接”吧!

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
}

查詢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)", // 過(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é)果

什么是go ldap連接

什么是go ldap連接

到此,相信大家對(duì)“什么是go ldap連接”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI