Обновление LDAP с JAVA через Quercus
Я пытаюсь обновить пароль через портлет в Quercus, используя библиотеки Java. Вот часть кода, который я использую:
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", "P@ssw0rd");
$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","0therP@ssw0rd");
//$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);
}
После выполнения этого кода я получаю следующую ошибку от сервера LDAP: javax.naming.directory.InitialDirContext.modifyAttributes: [LDAP: код ошибки 1 - 000020D6: SvcErr: DSID-031007DB, проблема 5012 (DIR_ERROR), данные 0 ]
Поэтому мне интересно несколько вещей. Во-первых, если у меня правильный синтаксис вызова функции modifyAttributes. Я пробовал это с dc = example, dc = edu, прикрепленным к строке запроса, но безуспешно. Первый запрос возвращает результаты правильно, поэтому я уверен, что я подключаюсь к серверу AD, и у меня был кто-то, кто проверял, что JVM, выполняющая код, имеет действительный актуальный сертификат в своем хранилище.
Ошибка заставляет меня поверить, что мне нужно точное местоположение, указанное для объекта, который я пытаюсь обновить, которого у меня нет.
Спасибо за ваши мысли по этому вопросу!
1 ответ
Поэтому я нашел часть своего ответа, получив DN и используя его вместо sAMAccountName для сброса пароля.
Я установил $rsDN следующим образом:
$rsDN = $item->getNameInNamespace();
и выполните вызов для изменения пароля как таковой:
$ADCtx->modifyAttributes($rsDN,2,$ADAttributes);
Теперь, конечно, я получаю ошибки SSL, но я по крайней мере попал в нужный объект с обновлением.