C'est délicat. Vous ne pouvez pas définir de mots de passe non cryptés, et si vous n'avez pas configuré toute votre structure cryptographique, vous ne pouvez pas utiliser LDAPS, vous devez donc utiliser Kerberos à la place.
Je suis fonctionner comme ceci: - faire une liaison simple à AD - kerberise votre session - créer un compte d'utilisateur avec un mot de passe, mais le mettre a expiré) vous pouvez maintenant utiliser une connexion normale pour définir d'autres propriétés .
// KRB5 connection details:
System.setProperty("java.security.krb5.kdc", "domain.com");
String username = "[email protected]";
String realm = "DOMAIN.COM";
System.setProperty("java.security.krb5.realm", realm);
System.setProperty("java.security.krb5.debug", "true");
System.setProperty("sun.security.krb5.debug", "true");
// standard JNDI LDAP stuff:
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.PROVIDER_URL, "ldap://dc01.domain.com:389");
env.put(Context.SECURITY_PRINCIPAL, username);
env.put(Context.SECURITY_CREDENTIALS, "abcd1234");
ctxt = new InitialLdapContext(env, new Control [0]);
// kerberised connection details:
LoginModule module;
module = (LoginModule) Class.forName("com.sun.security.auth.module.Krb5LoginModule").newInstance();
Subject subject = new Subject();
Map<String, String> options = new HashMap<String, String>();
Map<String, Object> sharedState = new HashMap<String, Object>();
sharedState.put("javax.security.auth.login.password", properties.getProperty("ad.passwd").toCharArray());
sharedState.put("javax.security.auth.login.name", username);
options.put("principal", username);
options.put("storeKey", "true");
options.put("useFirstPass", "true");
options.put("debug", "true");
module.initialize(subject, null, sharedState, options);
module.login();
module.commit();
// now create a user account:
Subject.doAs(svc.getSubject(), new PrivilegedExceptionAction<Object>() {
@Override
public Object run() throws Exception {
try {
String password = "\"Password1\"";
final Hashtable<String, String> env = svc.getEnvironment();
env.put(Context.SECURITY_AUTHENTICATION, "GSSAPI");
LdapContext ctxt = new InitialLdapContext(env, new Control[0]);
ModificationItem[] mods = new ModificationItem[1];
mods[0] = new
ModificationItem(DirContext.REPLACE_ATTRIBUTE, new
BasicAttribute("userPassword", password.getBytes("UTF-16LE")));
ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("userAccountControl", Integer.toString(UF_NORMAL_ACCOUNT + UF_PASSWORD_EXPIRED)));
ctxt.modifyAttributes(dn, mods);
}
catch (NamingException e) {
System.out.println("Failed to set password.");
e.printStackTrace();
}
return null;
}
});
Vous pouvez maintenant modifier les autres paramètres normalement.
Espérons que ça aide.
Jim
Il ne répond pas à la question, n'est-ce pas? – BrunoJCM
@BrunoJCM Quelle partie n'a pas reçu de réponse? –
L'utilisateur a demandé comment créer un nouveau compte et ce code gère les groupes d'utilisateurs. cela ne semble pas répondre à la question. Désolé si quelque chose me manque. – BrunoJCM