您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關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. ldap.Dail #這一步是底層的連接上
2. ldap.Bind #類似于用戶名密碼認證
3.操作 比如 查詢,刪除,增加用戶
第一步: 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. NewDelRequest, 然后調用ldap.Del
用戶密碼修改, 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
password: 123456
家目錄: /home/wujq
所屬的組: test (id=1003)
1. 首先確認我需要添加的用戶dn: uid=wujq,ou=People,dc=wjq,dc=com
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”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。