2014-05-13 4 views
0

Je tente de mettre à jour un mot de passe via un portlet dans Quercus en utilisant des bibliothèques Java. Voici une partie du code que j'utilise:Mise à jour LDAP avec JAVA via Quercus

import javax.naming.Context; 
import javax.naming.InitialContext; 
import javax.naming.directory.DirContext; 
import javax.naming.directory.InitialDirContext; 
import javax.naming.directory.BasicAttributes; 
import javax.naming.directory.BasicAttribute; 
import javax.naming.directory.SearchControls; 
import javax.sql.DataSource; 
import java.util.Hashtable; 

$uname = isset($_POST['uname'])?$_POST['uname']:''; 
$pass1 = isset($_POST['pass1'])?$_POST['pass1']:''; 

//connecto to LDAP 
$ldapADURL = "ldaps://poplar.example.edu:636"; 
$ldapEnv = new HashTable(); 
$ldapEnv->put("java.naming.factory.initial","com.sun.jndi.ldap.LdapCtxFactory"); 
$ldapEnv->put("java.naming.provider.url", $ldapADURL); 
$ldapEnv->put("java.naming.security.protocal", "ssl"); 
$ldapEnv->put("java.naming.referral", "follow"); 
$ldapEnv->put("java.naming.security.authentication", "simple"); 
$ldapEnv->put("java.naming.security.principal", "ADUser"); 
$ldapEnv->put("java.naming.security.credentials", "[email protected]"); 
$ADCtx = new InitialDirContext($ldapEnv); 

//query the vault for our user 
$ctlsAD = new SearchControls(); 
$attribsAD = array("sAMAccountName","DN","title","extensionAttribute14","extensionAttribute8","cn"); 
$ctlsAD->setReturningAttributes($attribsAD); 
$ctlsAD->setSearchScope(2); 
$filter="(sAMAccountName=" . $uname . ")"; 
$resultAD=$ADCtx->search("DC=conncoll,DC=edu",$filter,$ctlsAD); 

if ($resultAD->hasMore()) { 
    $item = $resultAD->next(); 
    $resultADAttribs = $item->getAttributes(); 
    $rsTitle = str_replace("title: ","",$resultADAttribs->get("title")); 
    $rsAttrib14 = str_replace("extensionAttribute14: ","",$resultADAttribs->get("extensionAttribute14")); 
    $rsAttrib8 = str_replace("extensionAttribute8: ","",$resultADAttribs->get("extensionAttribute8")); 
    $rsUname = str_replace("sAMAccountName: ","",$resultADAttribs->get("sAMAccountName")); 
    $rsDN = str_replace("dn: ","",$resultADAttribs->get("DN")); 
} 

echo ('<br />' . $rsTitle . '<br />' . $rsAttrib14 . '<br />' . $rsAttrib8 . '<br />' . $rsUname . '<br />' . $rsDN . '<br />'); 

if (isset($rsUname)/*ccLDAPCheckUser($uname)*/){ 
    $ADCtx->addToEnvironment("java.naming.security.principal","OtherADUser"); 
    $ADCtx->addToEnvironment("java.naming.security.credentials","[email protected]"); 
    //$resultAD2 = $ADCtx->search("DC=conncoll,DC=edu",$filter,$ctlsAD); 
    $pass2 = "\"" . $pass1 . "\""; 
    $newPass = mb_convert_encoding($pass2, "UTF-16LE"); 
    $ADNewPass = new BasicAttribute("userpassword",$newPass); 
    $ADNewAttrib8 = new BasicAttribute("extensionAttribute8",$rsAttrib8); 
    $ADAttributes = new BasicAttributes(); 
    $ADAttributes->put($ADNewPass); 
    $ADAttributes->put($ADNewAttrib8); 
    $ADCtx->modifyAttributes("sAMAccountName=" . $rsUname,2,$ADAttributes); 
} 

Après l'exécution de ce code, je reçois l'erreur suivante à partir du serveur LDAP: javax.naming.directory.InitialDirContext.modifyAttributes: [LDAP: code d'erreur 1 - 000020D6: SvcErr: DSID-031007DB, problème 5012 (DIR_ERROR), données 0]

Donc je me demande plusieurs choses. La première est si j'ai la syntaxe de l'appel de la fonction modifyAttributes correcte. Je l'ai essayé avec dc = example, dc = edu collé sur la chaîne de requête à pas de succès. La première requête renvoie les résultats correctement, donc je suis sûr que je me connecte au serveur AD et j'ai demandé à quelqu'un de vérifier que la JVM exécutant le code avait un certificat à jour valide dans son magasin. L'erreur me fait croire que j'ai besoin de l'emplacement exact spécifié pour l'objet que j'essaye de mettre à jour, que je n'ai pas.

Merci pour votre avis sur la question!

Répondre

0

J'ai donc trouvé une partie de ma réponse avec l'obtention du nom distinctif et l'utilisation de celui-ci au lieu de sAMAccountName pour émettre une réinitialisation du mot de passe.

Je mis Rsdn $ comme suit:

$rsDN = $item->getNameInNamespace(); 

et émettre l'appel à changer le mot de passe en tant que tel:

$ADCtx->modifyAttributes($rsDN,2,$ADAttributes); 

Maintenant, je suis bien sûr obtenir des erreurs SSL mais je suis à moins frapper l'objet correct avec la mise à jour.