Risolto!
in fase di creazione passo l'attributo userPassword in formato hash usando l'SHA-1, ovvero usando l'oggetto MessageDigest con algoritmo SHA-1. Poi in fase di autenticazine (new InitialDirContext(...)) passo Context.SECURITY_CREDENTIALS in chiaro
Codice per hashing
codice:
public static String digest(String string,int alg) throws UnsupportedEncodingException, NoSuchAlgorithmException
{
if (string == null || string.equals("")) { return string; }
byte[] bytePlainString = string.getBytes("UTF8");
MessageDigest messageDigest = MessageDigest.getInstance(algs[alg]);
messageDigest.update(bytePlainString);
String encodedString = Base64.encodeBytes(messageDigest.digest());
return encodedString;
}
Nella classe LDAPTool avrò quindi... (parte del code che interessa la discussione)
codice:
public static void initialize(String dnbase,String ldapurl,String ldapadmin,String ldappwd){
basedn=dnbase.trim();
ldapURL=ldapurl;
ldapAdminDN=ldapadmin;
ldapAdminPWD=ldappwd;
objClasses = new BasicAttribute("objectclass");
objClasses.add("top");
objClasses.add("person");
objClasses.add("inetOrgPerson");
}
private static DirContext getInitialDirContext(String ldapUser,String ldapPwd) throws NamingException{
Hashtable<String,String> env = new Hashtable<String,String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, ldapCTX);
env.put(Context.PROVIDER_URL, ldapURL);
env.put(Context.SECURITY_AUTHENTICATION, ldapAUTH);
env.put(Context.SECURITY_PRINCIPAL, ldapUser);
env.put(Context.SECURITY_CREDENTIALS, ldapPwd);
log.debug("Try connect to "+ldapURL);
log.debug("ldapUser "+ldapUser);
log.debug("ldapPwd "+ldapPwd);
return new InitialDirContext(env);
}
private static String getLdapUserDN(Attributes attrs) throws NamingException{
return "cn="+attrs.get("cn").get().toString()+","+basedn;
}
public static boolean authenticateUser(String uid, String pwd) throws Exception {
//String DN_CUSTOMER;
boolean retVal = false;
String ldapUserDN = "cn="+uid+","+basedn;
String ldapUserPW = pwd;
try {
DirContext ctx = getInitialDirContext(ldapUserDN,ldapUserPW);
ctx.close();
log.debug("Autenticated User!");
retVal = true;
} catch (AuthenticationException authEx) {
log.error("Authentication failed!",authEx);
throw authEx;
} catch (Exception e) {
log.fatal("Unable to connect LDAP ("+ldapURL+"): ",e);
throw new Exception("Unable to connect LDAP ("+ldapURL+"): ",e);
}
return retVal;
}
public static void createUser(Map<String,String> ldapUserAttributes,Map<String,String> pwdattr) throws Exception {
Attributes attributes = new BasicAttributes();
//Atributi classes:
attributes.put(objClasses);
//Attributi utente:
for(String key:ldapUserAttributes.keySet()){
attributes.put(new BasicAttribute(key,ldapUserAttributes.get(key)));
}
for(String key:pwdattr.keySet()){
attributes.put(new BasicAttribute(key,"{SHA}"+CryptUtility.digest(pwdattr.get(key),CryptUtility.SHA1)));
}
String ldapUserDN = getLdapUserDN(attributes);
try{
DirContext ctx = getInitialDirContext(ldapAdminDN,ldapAdminPWD);
//creazione dell'utente
ctx.createSubcontext(ldapUserDN, attributes);
ctx.close();
log.debug("User created!");
}
catch (NameAlreadyBoundException nabe){
log.error("UserDN already exixsts ",nabe);
throw nabe;
}
catch (Exception e){
log.error(e);
throw e;
}
}
Grazie infinite a tutti per la pazienza e il tempo dedicato