0

Java ライブラリを使用して、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", "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 サーバーから次のエラーが表示されます。

そこで、いろいろ気になります。1 つ目は、modifyAttributes 関数呼び出しの構文が正しいかどうかです。dc=example,dc=edu をクエリ文字列に追加して試しましたが、成功しませんでした。最初のクエリは結果を正しく返すので、AD サーバーに接続していると確信しており、コードを実行している JVM のストアに有効な最新の証明書があることを誰かに確認してもらいました。

エラーは、更新しようとしているオブジェクトに指定された正確な場所が必要であると信じさせますが、それはありません。

この問題についてご意見をお寄せいただきありがとうございます。

4

1 に答える 1

0

したがって、DNを取得し、sAMAccountNameの代わりにそれを使用してパスワードのリセットを発行するという私の答えの一部を見つけました。

$rsDN を次のように設定します。

$rsDN = $item->getNameInNamespace();

パスワードを次のように変更する呼び出しを発行します。

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

もちろん、SSLエラーが発生していますが、少なくとも更新で正しいオブジェクトにヒットしています。

于 2014-05-13T14:52:02.027 に答える