首頁  >  文章  >  後端開發  >  Golang如何連接Ldap

Golang如何連接Ldap

藏色散人
藏色散人轉載
2021-05-31 10:10:183718瀏覽

下面由golang教學欄位來介紹Golang如何連接Ldap,希望對需要的朋友有幫助!

今天在這裡寫一些Golang怎麼連接ldap

golang的ldap套件有一些,我使用的是

go get -u "gopkg.in/ldap.v2"

我的ldap環境:

# rootdn:  uid=admin,dc=wjq,dc=com     password: openldap

dn: dc=wjq,dc=com
dc: wjq
objectClass: top
objectClass: domain

dn: ou=Group,dc=wjq,dc=com
ou: Group
objectClass: top
objectClass: organizationalUnit

dn: ou=People,dc=wjq,dc=com
ou: People
objectClass: top
objectClass: organizationalUnit

dn: uid=admin,dc=wjq,dc=com
uid: admin
objectClass: top
objectClass: account

一個群組與一個使用者:

#组信息
dn: cn=test,ou=Group,dc=wjq,dc=com
gidNumber: 1003
cn: test
objectClass: posixGroup

#用户信息
dn: uid=test,ou=People,dc=wjq,dc=com
uidNumber: 1009
gidNumber: 1003
gecos: test
homeDirectory: /home/test
uid: test
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
shadowInactive: -1
shadowExpire: -1
shadowFlag: -1
objectClass: posixAccount
objectClass: shadowAccount
objectClass: account
cn: test
userPassword:: e1NTSEF9d053TWhYRTR4STJUUmpJWm5MTkF4VFlBTFhJdStaZ0Q=
shadowLastChange: 17858

golang處理步驟如下:

##    1. .Dail             #這一步是底層的連線上

      2. ldap.Bind            ## 認證識別碼,與使用者識別碼

第一步: Dail

   Dail有兩個參數network,  address, 回傳(*Conn,  error)#    network: 是指網絡協議  tcp,  udp

    address:  是底層要連接的地址,需要帶端口號

con, err := ldap.Dial("tcp", "127.0.0.1:389")

  

第二步: 認證 

  Bind(rootdn, password)  (error)

berror := conn.Bind("uid=admin,dc=wjq,dc=com", "openldap")
  

第三個步驟: 操作

;

   操作很有特點,我覺得也許是golang語言的特點,例如    查詢,  ldap提供一個查詢的結構體--  ldap.NewSearchRequest,   只要我們把資料填入進去,然後呼叫ldap.Search

   新增,    ldap提供一個新增的結構體  -- ldap.NewAddRequest,   填入好數據,  然後呼叫ldap.Add

   刪除,   ldap提供刪除結構體  -- ldap. NewDel #   使用者密碼修改, ldap提供修改使用者密碼的結構體  -- ldap.NewPasswordModifyRequest , 然後呼叫ldap.PasswordModify

  這個非常有特點,來看看:

 查詢使用者群組NewSearchRequest:

func NewSearchRequest(
    BaseDN string,
    Scope, DerefAliases, SizeLimit, TimeLimit int,
    TypesOnly bool,
    Filter string,
    Attributes []string,
    Controls []Control,
) *SearchRequest

 BaseDN: 根據我的ldap環境應該是   ou=Group,dc=wjq,dc=com

scope:  我理解的是查詢的範圍,ldap是一個目錄樹,我一般設定ldap.ScopeWholeSubtree 

DerefAiases: 搜尋中別名(cn, ou)是否廢棄,設定:   ldap.NeverDerefAliases

SizeLimit:大小設定,一般設定為0

TimeLimit: 時間設定,一般設定為0

TypesOnly:  設定false(好像回傳的值要多一點)

Controls:  是控制我沒怎麼用過,一般設定nil

這些我也沒理解透詳細可以參考: https://tools.ietf.org/html/rfc4511

#查詢中主要的兩個參數Filter, Attributes

#Filter是過濾條件

Attributes 傳回的屬性值

建立SearchRequest結構體:

srsql := ldap.NewSearchRequest("ou=Group,dc=wjq,dc=com",
                       ldap.ScopeWholeSubtree, 
                       ldap.NeverDerefAliases,
                       0,
                       0, 
                      false,
                     "(&(objectClass=posixGroup))", 
                     []string{"dn", "cn", "uid"}, 
 nil)

 Filter:  (&objectClass=posixGroup )) 尋找所有group,傳回每個群組的dn, cn, uid

過濾test使用者群組:  (&(objectClass=posixGroup)(cn=test)) #過濾使用者cn= test,或uid=test(當然baseDn是使用者的):  "(|(&(objectClass=posixAccount)(cn=test))(&(objectClass=posixAccount)(uid=test)))"

執行Search並且取得結果(在cur.Entries中):

cur, er := l.Search(srsql)
	if er != nil {
		log.Fatalln(er)
	}

if (len(cur.Entries) > 0){

	for _, item := range cur.Entries {

		cn := item.GetAttributeValue("cn")

		if cn == "" {
			cn = item.GetAttributeValue("uid")
		}

		fmt.Println(cn)

	}
}

以上就是Search的步驟。

在來看看新增使用者: NewAddRequest##新增             使用者:  wujq

       /wujq

           所屬的群組:  test  (id=1003)

1. 首先確認我需要新增的使用者dn:  uid=wujq,ou=People,dc=wj,, 10

2.  gidNumber 是1003

3. 因為需要uidNumber值,假設我設定為1010(系統沒有使用)

執行程式碼如下:

sql := ldap.NewAddRequest("uid=wujq,ou=People,dc=wjq,dc=com")
sql.Attribute("uidNumber", []string{"1010"})
sql.Attribute("gidNumber", []string{"1003"})
sql.Attribute("userPassword", []string{"123456"})
sql.Attribute("homeDirectory", []string{"/home/wujq"})
sql.Attribute("cn", []string{"wujq"})
sql.Attribute("uid", []string{"wujq"})
sql.Attribute("objectClass", []string{"shadowAccount", "posixAccount", "account"})
er := ldapcon.Add(sql)

以上是Golang如何連接Ldap的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除