次の golang のチュートリアル コラムでは、Golang を LDAP に接続する方法を紹介します。困っている友人の役に立てば幸いです。
今日は、Golang が ldap に接続する方法について書きます。
Golang にはいくつかの ldap パッケージがあり、私は
go get -u "gopkg.in/ldap.v2"
を使用します。私の ldap 環境:
rootdn: uid =admin,dc=wjq,dc=com パスワード: 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. クエリ、削除、ユーザーの追加などの操作#ステップ 1: Dail## Dail には 2 つのパラメータがあります network, address, return (*Conn, error)
network: ネットワーク プロトコル tcp を指します。 udp アドレス: 最下層に接続するアドレスであり、ポート番号が必要ですcon, err := ldap.Dial("tcp", "127.0.0.1:389")ステップ 2: 認証
Bind(rootdn,password) (error)
berror := conn.Bind("uid=admin,dc=wjq,dc=com", "openldap")ステップ 3: 操作
; この操作は非常に独特ですおそらく、
クエリなどの Golang 言語の特性だと思います。データを入力して ldap.Searchを呼び出す限り、ldap はクエリ構造 -- ldap.NewSearchRequest を提供します。
Add、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, ) *SearchRequestBaseDN: 私の LDAP 環境によると、ou=Group,dc=wjq,dc=comscope: 私が理解していることクエリのスコープ ldap はディレクトリ ツリー I 一般設定 ldap.ScopeWholeSubtree DerefAiases: 検索でエイリアス (cn、ou) を破棄するかどうか、設定: ldap.NeverDerefAliases SizeLimit: サイズ設定、通常は 0
## に設定 #TimeLimit: 時間設定、通常は 0
##TypesOnly: false に設定 (もう少し多くの値が返されるようです)コントロール: これはあまり使用したことのないコントロールで、通常は nil に設定されていますこれらを完全には理解していません。https://tools.ietf.org/html/rfc4511 を参照してください。 クエリの主な 2 つのパラメータは、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)フィルター: (&objectClass=posixGroup )) すべてのグループを検索し、各グループの dn、cn、uid を返しますフィルター テストユーザー グループ: (&(objectClass=posixGroup)(cn=test)) ユーザー cn= test または uid=test をフィルターします (もちろん、baseDn はユーザーのものです): "(|(&(objectClass=posixAccount) )(cn=test))(&(objectClass=posixAccount)(uid=test)))" 検索を実行して結果を取得します (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) } }以上が検索の手順です。 ユーザーの追加を見てみましょう: NewAddRequestAdd ユーザー: wujq パスワード: 123456 ホーム ディレクトリ: /home /wujq 所属するグループ: test (id=1003)1. まず、追加する必要があるユーザー DN を確認します: uid=wujq,ou=People,dc= wjq,dc=com 2。gidNumber は 10033 です。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 中国語 Web サイトの他の関連記事を参照してください。