[Java] Référence / mise à jour d'Active Directory

introduction

Je veux pouvoir obtenir et mettre à jour la liste des utilisateurs afin de fournir la fonction de gestion des utilisateurs AD. En Java, vous pouvez accéder à AD à l'aide de JNDI.

Référence AD

Obtenez un seul utilisateur

Pour effectuer une recherche en spécifiant un ID utilisateur pour l'authentification AD, reportez-vous à l'URL ci-dessous.

https://www.earthlink.co.jp/engineerblog/intra-mart-engineerblog/3336/

Obtenir la liste des utilisateurs

Pour les recherches censées avoir plusieurs résultats, comme une liste d'utilisateurs appartenant à une unité d'organisation particulière, vous devez connaître la taille de la page LDAP. Pour Active Directory sous Windows, peut-être 1 000 est la taille maximale du résultat. Si vous souhaitez obtenir plus que cela, répétez la recherche pendant la pagination.

Exemple pour obtenir la liste des utilisateurs lors de la pagination


Hashtable<String, String> env = new Hashtable<String, String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://server"); //Adresse du serveur AD
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "userid@domain"); //ID utilisateur pour se connecter au serveur AD@domaine
env.put(Context.SECURITY_CREDENTIALS, "password"); //mot de passe

final int PAGE_SIZE = 1000;

InitialLdapContext context = null;
try {
	context = new InitialLdapContext(env, null);

	//Spécifier les conditions de recherche
	String name = "OU=aaa, DC=bbb, DC=ccc";
	String filter = "(objectCategory=user)";

	SearchControls control = new SearchControls();
	control.setSearchScope(SearchControls.SUBTREE_SCOPE);

	byte[] cookie = null;

	do {
		context.setRequestControls(new Control[] { new PagedResultsControl(PAGE_SIZE, cookie,
				Control.CRITICAL) });

		//Exécution de la recherche
		NamingEnumeration<SearchResult> results = context.search(name, filter, control);

		//Obtenir des résultats
		while (results.hasMore()) {
			SearchResult result = results.next();
			AdUserBean user = new AdUserBean(result);

			System.out.println(user);
		}

		//Vérifiez s'il y a une page suivante
		cookie = null;

		if (context.getResponseControls() != null) {
			Optional<Control> found = Arrays.stream(context.getResponseControls())
					.filter(c -> c instanceof PagedResultsResponseControl).findFirst();

			if (found.isPresent()) {
				PagedResultsResponseControl prrc = (PagedResultsResponseControl) found.get();
				cookie = prrc.getCookie();
			}
		}

	} while (cookie != null);

} finally {
	try {
		if (context != null) {
			context.close();
		}
	} catch (NamingException e) {
	}
}

AdUserBean


public class AdUserBean {

	private String cn = null;
	private String name = null;
	/**Nom*/
	private String displayName = null;
	/**ID utilisateur + domaine*/
	private String userPrincipalName = null;
	/**Nom distinctif LDAP*/
	private String distinguishedName = null;
	/**adresse mail*/
	private String mail = null;
	/**Cloche de poche*/
	private String pager = null;

	/**
	 *constructeur
	 */
	public AdUserBean() {

	}


	/**
	 *constructeur
	 *
	 *Obtenir du contenu à partir des résultats de recherche Active Directory
	 *
	 * @param result
	 * @throws NamingException
	 */
	public AdUserBean(SearchResult result) throws NamingException {
		NamingEnumeration<? extends Attribute> attributes = result.getAttributes().getAll();

		while (attributes.hasMoreElements()) {
			Attribute attribute = attributes.next();
			Object value = attribute.get();

			if ("name".equals(attribute.getID())) {
				if (value instanceof String) {
					name = (String) value;
				}

			} else if ("displayName".equals(attribute.getID())) {
				if (value instanceof String) {
					displayName = (String) value;
				}

			} else if ("cn".equals(attribute.getID())) {
				if (value instanceof String) {
					cn = (String) value;
				}

			} else if ("userPrincipalName".equals(attribute.getID())) {
				if (value instanceof String) {
					userPrincipalName = (String) value;
				}

			} else if ("pager".equals(attribute.getID())) {
				if (value instanceof String) {
					pager = (String) value;
				}

			} else if ("mail".equals(attribute.getID())) {
				if (value instanceof String) {
					mail = (String) value;
				}

			} else if ("distinguishedName".equals(attribute.getID())) {
				if (value instanceof String) {
					distinguishedName = (String) value;
				}

			}
		}

	}

//Ce qui suit est omis
}

Différence entre «hasMore» et «hasMoreElements»

Il existe deux types de classe NamingEnumeration, qui est la valeur de retour de la méthode search (), la méthode hasMoreElements dans la classe ordinaire ʻEnumeration et la méthode d'origine hasMore`.

while (results.hasMore()) {
	SearchResult result = results.next();
	//Abréviation
}

La méthode hasMore lève une NamingException, par exemple, en essayant d'obtenir plus que la taille de la page. https://docs.oracle.com/javase/jp/11/docs/api/java.naming/javax/naming/NamingEnumeration.html

Cependant, lors de la recherche d'AD lors de la pagination comme dans l'exemple précédent, aucune erreur ne se produira même si la taille de page spécifiée du côté code> la taille de la page côté serveur et le résultat de la recherche sera la taille de la page côté serveur. revenu.

Comment prendre des valeurs d'attribut

Les attributs Active Directory incluent des éléments avec une seule valeur et des éléments avec plusieurs valeurs. Veuillez noter que la méthode d'acquisition est différente pour chacun.

Extrait de la partie acquisition de la valeur d'attribut


/**Cloche de poche*/
private String pager = null;
/**Cloche de poche(Autre) */
private List<String> otherPager = null;

public AdUserBean(SearchResult result) throws NamingException {
	NamingEnumeration<? extends Attribute> attributes = result.getAttributes().getAll();

	while (attributes.hasMoreElements()) {
		Attribute attribute = attributes.next();
		Object value = attribute.get();

		if ("pager".equals(attribute.getID())) {
			//Cloche de poche(Un seul article)
			if (value instanceof String) {
				pager = (String) value;
			}

		} else if ("otherPager".equals(attribute.getID())) {
			//Cloche de poche(Autre) (Articles multiples)
			NamingEnumeration<?> values = attribute.getAll();

			while (values.hasMore()) {
				if (value instanceof String) {
					if (otherPager == null) {
						otherPager = new ArrayList<String>();
					}

					value = values.next();

					otherPager.add((String) value);
				}
			}

		}
	}
}

Modifier les attributs utilisateur

Modifier les attributs utilisateur


private static void update() throws NamingException {

	Hashtable<String, String> env = new Hashtable<String, String>();
	env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
	env.put(Context.PROVIDER_URL, "ldap://server"); //Adresse du serveur AD
	env.put(Context.SECURITY_AUTHENTICATION, "simple");
	env.put(Context.SECURITY_PRINCIPAL, "user@domain"); //ID utilisateur pour se connecter au serveur AD@domaine
	env.put(Context.SECURITY_CREDENTIALS, "password"); //mot de passe

	DirContext context = null;
	try {
		context = new InitialDirContext(env);

		Attributes attrs = new BasicAttributes();
		attrs.put(new BasicAttribute("pager", "123456"));
		attrs.put(new BasicAttribute("telephoneNumber", "1234567"));

		String name = "CN=username, OU=xxx, DC=yyy, DC=zzz";

		context.modifyAttributes(name, DirContext.REPLACE_ATTRIBUTE, attrs);

	} finally {
		try {
			if (context != null) {
				context.close();
			}
		} catch (NamingException e) {
		}
	}
}

Le DN spécifié dans l'argument de «modifyAttributes» doit spécifier l'unité d'organisation à laquelle appartient l'utilisateur (objet). Si vous omettez la hiérarchie de l'unité d'organisation, vous obtiendrez une erreur indiquant «Objet introuvable».

Référence des attributs et des filtres de recherche

L'adresse e-mail est un élément unique, mais plusieurs numéros de téléphone peuvent être spécifiés.

Explication des attributs utilisateur dans Active Directory (il existe d'autres pages d'explication pour chaque type d'attribut) https://docs.microsoft.com/en-us/windows/win32/ad/naming-properties

Liste des attributs Active Directory https://docs.microsoft.com/en-us/windows/win32/adschema/attributes-all

Syntaxe du filtre de recherche LDAP http://software.fujitsu.com/jp/manual/manualfiles/M050000/B1WN4911/01/idmgr07/idmgr447.htm https://www.ibm.com/support/knowledgecenter/ja/SSYJ99_8.5.0/admin-system/rbug_ldapfltrxprns.html

Recommended Posts

[Java] Référence / mise à jour d'Active Directory
Pensez à une stratégie de mise à jour Java
Mémo: [Java] Vérifiez le contenu du répertoire
Référence de la méthode Java8
référence de la méthode java8
Matériaux de référence JAVA
création de répertoire java
Ma référence Java
[Java] Présentation de Java
Revue Java ③ (utilisation de base des tableaux / type de référence)
Collection expirée de java
Caractéristiques prévues de Java
[Java] Importance de serialVersionUID
NIO.2 examen de Java
Avis sur Java Shilber
Répertoire de base Mac Java
java --Unification des commentaires
Utilisation de Active Hash
Histoire des annotations Java
java (mérites du polymorphisme)
Les pièges d'Active Hash
Examen NIO de Java
[Java] Trois fonctionnalités de Java
Résumé du support Java 2018
[Java] Différence entre l’affectation d’une variable de type de base et l’affectation d’une variable de type de référence
La faible référence de JAVA a réutilisé l'instance allouée pour chaque thread
[Java] Référence de classe de wrapper Integer
À propos des instances Java
[Java] Utilisation de Mirage-Basic de SQL
Référence du service Java VB.net à mi-chemin
[Java] Pratique de la gestion des exceptions [Exception]
[Java11] Résumé du flux -Avantages du flux-
Principes de base de l'utilisation des caractères (Java)
java learning day 4
[Java] Compréhension débutante de Servlet-①
Java fin du mois plusMonths
[Java] Résumé des expressions régulières
[Java] Résumé des opérateurs (opérateur)
[Java] Implémentation du réseau Faistel
Mise à jour de la synchronisation d'Eclipse org.eclipse.wst.common.component
[Java] Comparateur de la classe Collection
Résumé des bases du langage Java
Résumé de la classe Java Math
Énumération de toutes les combinaisons Java
java (héritage du principe is-a)
Avantages et inconvénients de Java
Avantages de la méthode statique Java
[Java] Résumé de la syntaxe de contrôle
Implémentation Java de tri-tree
Arrêter la mise à jour automatique d'Ubuntu
Mise à jour de la synchronisation d'Eclipse org.eclipse.wst.common.component
Résumé du traitement des erreurs Java
[Java] Résumé des modèles de conception
[Java] Résumé des opérations mathématiques
Gestion de la virgule flottante java Lors de la lecture du livre de référence [Note]
L'histoire de ne pas connaître le comportement de String en passant par Java