Maison >développement back-end >Golang >Comment connecter Ldap à Golang

Comment connecter Ldap à Golang

藏色散人
藏色散人avant
2021-05-31 10:10:183845parcourir

La colonne tutorielle suivante de golang vous présentera comment connecter Ldap dans Golang. J'espère qu'elle sera utile aux amis dans le besoin !

Aujourd'hui, j'écris ici sur la façon dont Golang se connecte à ldap

Il existe des packages ldap dans golang que j'utilise

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

Mon environnement ldap :

rootdn : uid=admin,dc=wjq,dc=com mot de passe : 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

Un groupe et un utilisateur :

#组信息
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

les étapes de traitement de golang sont les suivantes :

1. ldap .Dail#Cette étape est la connexion sous-jacente

Première étape : Dail

Dail a deux paramètres réseau, adresse, retour (*Conn, erreur)

réseau : fait référence au réseau Protocole tcp, udp adresse : C'est l'adresse à connecter en couche inférieure et doit avoir un numéro de port

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

Deuxième étape : Authentification

Bind(rootdn, password) (erreur)

berror := conn.Bind("uid=admin,dc=wjq,dc=com", "openldap")
Étape 3 : Opération

;

L'opération est très unique, je pense que ce sont peut-être les caractéristiques du langage Golang, telles que la requête

, ldap fournit une structure de requête - ldap.NewSearchRequest, tant que nous remplissons les données puis appelons ldap.Search pour ajouter, ldap Fournissez une structure ajoutée -- ldap.NewAddRequest, remplissez les données, puis appelez ldap.Add

pour supprimer , ldap fournit une structure de suppression -- ldap.NewDelRequest, puis appelle ldap.Del

Modification du mot de passe utilisateur, ldap fournit une structure pour modifier les mots de passe utilisateur -- ldap.NewPasswordModifyRequest, puis appelle ldap.PasswordModify

C'est très unique, jetons un coup d'oeil :

Requête du groupe d'utilisateurs NewSearchRequest :

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

BaseDN : selon mon environnement ldap, cela devrait être ou=Group,dc=wjq, dc=com

scope : ce que je comprends, c'est la portée de la requête, ldap est une arborescence de répertoires, I Paramètres généraux ldap.ScopeWholeSubtree

DerefAiases : indique si les alias (cn, ou) sont supprimés dans la recherche, paramètres : ldap.NeverDerefAliases

SizeLimit : paramètres de taille, généralement définis sur 0

TimeLimit : paramètre de temps, généralement défini sur 0

TypesOnly : défini sur false ( il semble renvoyer un peu plus de valeur)

Contrôles : C'est un contrôle que je n'ai pas beaucoup utilisé, généralement réglé sur zéro

Je ne les comprends pas bien, vous pouvez vous référer à : https://tools.ietf.org/html/rfc4511

Les deux principaux paramètres de la requête sont Filter et Attributes

Filter C'est la valeur d'attribut renvoyée par la condition de filtre

Attributs

Créer la structure SearchRequest :

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

Filtre : (&objectClass=posixGroup )) Rechercher tous les groupes et renvoyer le dn , cn, uid de chaque groupe

Filtrer le groupe d'utilisateurs de test : (&(objectClass=posixGroup)(cn=test)) Filtrer l'utilisateur cn= test, ou uid=test (bien sûr baseDn est celui de l'utilisateur : "(|(&(objectClass=posixAccount)(cn=test))(&(objectClass=posixAccount)(uid=test)))"

Exécuter Recherchez et obtenez les résultats (dans 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)

	}
}

Ce qui précède sont les étapes de la recherche.

Voyons comment ajouter un utilisateur : NewAddRequestAjouter

Utilisateur : wujq

Mot de passe : 123456

Répertoire personnel : / home /wujq

Groupe auquel /wujq appartient : test (id=1003)

1 Confirmez d'abord le nom d'utilisateur que je dois ajouter : uid=wujq,ou=People,dc=. wjq,dc=com

2. gidNumber est 1003

3 Parce que la valeur uidNumber est obligatoire, supposons que je la définisse sur 1010 (non utilisée par le système)

Le code d'exécution est le suivant :

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)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer