ホームページ  >  記事  >  バックエンド開発  >  GolangでLDAPに接続する方法

GolangでLDAPに接続する方法

藏色散人
藏色散人転載
2021-05-31 10:10:183780ブラウズ

次の 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,
) *SearchRequest

BaseDN: 私の LDAP 環境によると、ou=Group,dc=wjq,dc=com

scope: 私が理解していることクエリのスコープ 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)

	}
}
以上が検索の手順です。 ユーザーの追加を見てみましょう: NewAddRequest

Add

ユーザー: wujq

パスワード: 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に接続する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。