4

私は管理者アカウントを持っていません (そして今後も持っていません)。Active Directory で自分自身 (ユーザー) のパスワードを Java から変更したいと考えています。これどうやってするの?

Web からのコードの使用:

private void changePass() throws Exception {
    String oldpass = this.encodePassword("oldpass!");
    String newpass = this.encodePassword("newpass!");
    Attribute oldattr = new BasicAttribute("unicodePwd", oldpass);
    Attribute newattr = new BasicAttribute("unicodePwd", newpass);
    ModificationItem olditem = new ModificationItem(DirContext.REMOVE_ATTRIBUTE, oldattr);
    ModificationItem newitem = new ModificationItem(DirContext.ADD_ATTRIBUTE, newattr);
    ModificationItem repitem = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, newattr);
    ModificationItem[] mods = new ModificationItem[2];
    mods[0] = olditem;
    mods[1] = newitem;
    // ldapTemplate.modifyAttributes("cn=administrator,cn=Users", mods);
    ldapTemplate.modifyAttributes("cn=smith,cn=Users", new ModificationItem[] { repitem });
}

ここにcontextSourceがあります

<bean id="contextSource" class="org.springframework.ldap.core.support.LdapContextSource">
    <property name="url" value="ldap://ldapserver:389"/>
    <property name="base" value="dc=company,dc=com"/>
    <property name="userDn" value="smith@company"/>
    <property name="password" value="oldpass"/>
</bean>

私が得た:

LDAP: error code 32 - 0000208D: NameErr: DSID-0310020A, problem 2001 (NO_OBJECT), data 0, best match of:
'CN=Users,DC=company,DC=com'

userDn を「cn=smith」に変更すると、次のようになります。

LdapErr: DSID-0C0903A9、コメント: AcceptSecurityContext エラー

おそらく私の問題は、LDAP がどのように機能するかを理解していないことでしょうか? 可能ですか(ユーザーアカウントを使用してユーザーパスワードを変更します)?また、可能であれば、同じ権限でアカウントがロックされている/期限切れになっていることを確認できますか?

更新 / 解決

助けてくれてありがとう。それは私もとても役に立ちました。

将来の検索者のために:

NO_OBJECT - アクティブ ディレクトリがオブジェクト (my cn=Users,cn=Smith) を見つけられないことを意味します。ユーザー カタログへの完全修飾正規パスを見つけるには、ユーザー属性「識別名」を使用できます (私の場合、最悪の場合は「cn=John\, Smith",ou=請負業者,ou=ユーザー アカウント,ou=アカウント" )

それから私は得ました:

WILL_NOT_PERFORM - これはさまざまな種類のことを意味します。私の場合、間違ったオブジェクトタイプがありましたが、以下で説明するように、SSL接続ではなく( ldaps://ではありません)、その他の可能性があります。

それから:

INSUFF_ACCESS_RIGHTS - ユーザー (管理者には REPLACE-password 属性の権限がない)。パスワードを変更するには、古いパスワードと新しいパスワードを入力してから、古いパスワードを削除して新しいパスワードを追加する必要があります。

Attribute oldattr = new BasicAttribute("unicodePwd", oldQuotedPassword.getBytes("UTF-16LE"));
Attribute newattr = new BasicAttribute("unicodePwd", newQuotedPassword.getBytes("UTF-16LE"));
ModificationItem olditem = new ModificationItem(DirContext.REMOVE_ATTRIBUTE, oldattr);
ModificationItem newitem = new ModificationItem(DirContext.ADD_ATTRIBUTE, newattr);
ldapTemplate.modifyAttributes("cn=John\\, Smith,ou=Contractors,ou=User Accounts,ou=Accounts", new ModificationItem[] { olditem, newitem });

問題 1005 (CONSTRAINT_ATT_TYPE) - 古いパスワードが間違っている場合

ところで

javax.naming.PartialResultException: 未処理の継続参照。残りの名前 '/' - 個人/ユーザーをグローバルに検索する場合 (たとえば、認証メソッドで) ldapTemplate.setIgnorePartialResultException( true ); それを修正できます

4

2 に答える 2

4

はい、できますが、少し注意が必要です。

最初にパスワードを変更するには、LDAP ではなく LDAPS 経由で接続する必要があります。それは TLS または SSL (少なくとも 128 ビット) 接続です。これをJNDIで行う方法の例を次に示します。

次に、パスワードを UTF-16LE でエンコードされたバイト配列として渡す必要があります。ただし、エンコードする前に、二重引用符で囲む必要があります。以下に例を示します。

String pass = "\"" + "newpass" + "\"";
byte[] password = pass.getBytes("UTF-16LE");
// You will need to handle UnsupportedEncodingException here
于 2012-03-14T12:47:49.137 に答える
1
  1. cn=smith,cn=Usersエントリの実際の DN でない場合は、そうである必要があります。

  2. すべてを削除/追加/置換する必要はありません。REPLACE_ATTRIBUTE を使用するだけです。管理者アカウントを使用してパスワードを変更している場合。

    自分でパスワードを更新する場合、つまり、更新しているのと同じアカウントにバインドされている場合は、これが必要です。その理由は、古いパスワードでの一致の失敗を検出できるように、削除用に古いパスワードを指定し、挿入用に新しいパスワードを指定する必要があるためです。または、拡張されたパスワード変更操作を使用することもできます。この場合も、古いパスワードと新しいパスワードの両方を指定します。

于 2012-03-14T10:55:30.810 に答える