1

私は会社でSpringを使用してJavaで開発しています。ローカルLDAPサーバーを備えたアプリケーションを開発しています。LDAPサーバーは情報の取得に使用されます。ただし、アプリケーションのユーザーにLDAP構造/スキーマを知られたくない場合があります。これは、顧客/ユーザーが独自のLDAP構造/スキーマを備えた独自のLDAPサーバーを持っているためです。

たとえば、顧客/ユーザーは、LDAPサーバーへの接続に使用されるLDAPサーバーの詳細を提供することにより、ユーザーインターフェイスを介して情報を取得します。接続すると、クエリを実行して情報を取得できるようになります。これで、LDAP構造に関する情報を知ることができなくなります。記述されるコードは、ユーザークエリを実行することによって実行されます。クエリが実行されると、その情報が返されます。それ以外の場合は、例外が発生します。

私が直面している問題は次のとおりです。

Spring LDAPを使用する場合、AttributesMapperおよびContextMapperと呼ばれるものがあります。これを使用するには、強く型付けされたオブジェクトを渡す必要があります。したがって、たとえば:

public class EmployeeAttributesMapper implements AttributesMapper {

public EmployeeAttributesMapper() {

}

/**
 * This method maps the Employee Entity to data stored in the LDAP Server through a Attribute.
 * @param attrs the name of the Attribute to get
 * @return the Employee Entity.
 */
public Object mapFromAttributes(Attributes attrs) throws NamingException {
    Employee employee = new Employee();
    employee.setFirstName((String) attrs.get("cn").get());
    return employee;
}
}

上記のコードをクエリに応じて実行すると、cn属性に関する情報のみがフェッチされ、他には何もフェッチされません。強く型付けされたオブジェクトを必要としないものは他にありますか?

どうしたらいいかわかりません。

たとえば、すべての従業員を検索するには、次のようにします。

public List getAllEmployees() {
    return ldapTemplate.search("", "(objectclass=person)", new EmployeeContextMapper());
}

これにより、すべての従業員が返されますが、cn属性のみが設定されます。ただし、顧客のLDAPサーバーでは、cnという属性がない場合があります。

これを行うための最良の方法は何ですか?私たちが作成するコードは、ユーザーインターフェイスと顧客のLDAPサーバー間のプロキシとして機能します。

4

1 に答える 1

1

最も簡単な答えは、属性の使用目的を属性タイプ(OIDまたはエイリアス)に抽象化することです。たとえば、「Name」をcn(共通名)属性エイリアスにマップし、「First Name」をgivenName属性にマップし、「LastName」を属性にマップsnします。IETFには、LDAPディレクトリサーバーデータベースでの使用が推奨されている属性を説明する多くのRFCがあります。inetOrgPerson(RFC2798)が良い例です。

プレゼンテーションが実装から正しく分離されている場合、ユーザーは、属性名は言うまでもなく、データがLDAPディレクトリサーバーからのものであることをまったく知る必要はありません。

于 2012-11-19T12:41:23.437 に答える