例: ユーザーとグループの検索をフィルタリングする Java クラスを作成する

ユーザー名またはグループ名の検索を絞り込むのに単一の検索フィルタでは不十分である場合、ディレクトリー検索の実行方法を厳密に定義したメソッドを含む Java クラスを作成できます。このクラスは、ユーザーによって入力された検索基準に基づいて各種の LDAP 検索フィルタを呼び出すことができます。

このタスクについて

Sametime® 管理ツールの LDAP ディレクトリー設定にある「ユーザー名を絞り込む検索フィルタ」「グループ名を絞り込む検索フィルタ」には、LDAP ディレクトリーからユーザー名とグループ名を選択する LDAP ディレクトリー検索フィルタが定義されます。

注: ユーザーとグループの両方の検索動作を制御する Java クラスを作成する必要はありません。単一の LDAP 検索フィルタを使用してグループの検索動作を制御しながらユーザーの検索動作を制御する、またはその逆を行う Java クラスを使用することができます。

LDAP 検索をカスタマイズするために作成するソースコードは、環境に完全に依存します。ここでは、使用する環境に適した Java クラスの作成方法を理解するのに役立つコードサンプルを示します。

注: 検索された名前は、作成された LDAP フィルタに追加する前に、LDAP RFC2254 に従ってエスケープする必要があります。以下の例のように、escape メソッドと isHex メソッドを使用してください。

以下の例では、ユーザーが Sametime® ユーザーインターフェースに入力したテキスト文字列に基づいて、異なる LDAP ディレクトリー検索フィルタが呼び出されます。メソッドで呼び出される検索フィルタは、ディレクトリースキーマ、環境で必要な検索動作によって異なります。3 人の異なるユーザーが Victor Lazlow というユーザーを Sametime® Connect Client のメンバー・リストに追加するものと想定します。3 人のユーザーは、それぞれ異なる方法で Victor Lazlow を検索します。Java クラスのロジックには、これらの 3 人のユーザーの検索結果が記述されます。

  • ユーザー 1

    入力: ユーザー 1 は、Sametime® クライアントのユーザー・インターフェースに「Victor L*」と入力して、Victor Lazlow を連絡先リストに追加しようとします。

    結果: この検索ではエラーが返されます。なぜなら、この Java クラスのプログラムは、入力されたテキスト文字列にアスタリスクが含まれていた場合にエラーを返すようにプログラミングされているためです。

  • User 2

    入力: ユーザー 2 は、Sametime® クライアントのインターフェースに「Victor_Lazlow@acme.com」と入力します。

    結果: この検索の試みは成功し、「Victor_Lazlow@acme.com」という値 (Victor Lazlow の電子メール・アドレス) が LDAP ディレクトリーから返されます。検索がこのように成功するのは、Java クラスが、LDAP ディレクトリー検索をユーザーのメール・アドレスに絞り込むことができる LDAP 検索フィルタを返すようにプログラミングされているためです。入力された検索テキスト文字列にアットマーク (@) が含まれていると、Java クラスはメール・アドレスの検索フィルタを返します。

  • User 3

    入力: ユーザー 3 は、Sametime® クライアントのインターフェースに「Victor L」と入力します。この検索の試みは成功し、共通名 (cn) ディレクトリー属性の「Victor Lazlow」が返されます。

    結果: 検索がこのように成功するのは、Java クラスが、LDAP ディレクトリー検索をユーザーの共通名 (cn) に絞り込むことができる LDAP 検索フィルタを返すようにプログラミングされているためです。エンド・ユーザーが入力した検索テキスト文字列にアスタリスクもアットマーク (@) も含まれていない場合、Java クラスはこの共通名検索フィルタを返します。

サンプル・コード

以下のコード・サンプルは、この検索動作を生成する Java ソース・コードを示しています。このコードにより、「peopleResolveFilter」メソッドを含む「StLdapCustomized」という名前の Java クラスが作成されます。peopleResolveFilter メソッドの if 文では、Sametime® クライアントのユーザーインターフェースに入力されたテキスト文字列が検査され、これに基づいて適切な LDAP 検索フィルタが返されます。各 if 文の目的は、ソースコード内のコメントで説明しています。

public class StLdapCustomized
{
	/**
	 * String representing an escaped forward slash sign '\'
	 */
	private final static String SLASH_SIGN_CONVERTED = "\\5c";

	/**
	 * String representing an escaped * sign '*'
	 */
	private final static String STAR_SIGN_CONVERTED = "\\2a";

	/**
	 * String representing an escaped opening bracket sign '('
	 */
	private final static String OPENING_BRACKET_SIGN_CONVERTED = "\\28";

	/**
	 * String representing an escaped closing bracket sign ')'
	 */
	private final static String CLOSING_BRACKET_SIGN_CONVERTED = "\\29";

	/**
	 * Escape problematic characters in the name to match the LDAP filter escaping
	 * criteria according to RFC2254
	 * rfc2254 - The String Representation of LDAP Search 
	 * @param name the name to escape
	 * @return an escaped string
	 */
	private static String escape(String name)
	{
		StringBuffer escapedName = new StringBuffer();
		for (int i=0; i< name.length(); ){
			switch(name.charAt(i)){
			case '\\':
				// if the next 2 chars are hex we don't need to escape
				if((i< name.length()-2) && isHex(name.charAt(i+1)) &&
						isHex(name.charAt(i+2))){
					escapedName.append('\\');
					escapedName.append(name.charAt(++i));
					escapedName.append(name.charAt(++i));
				}
				else{
					escapedName.append(SLASH_SIGN_CONVERTED);
				}
				i++;
				break;

			case '*':
				escapedName.append(STAR_SIGN_CONVERTED);
				i++;
				break;

			case '(':
				escapedName.append(OPENING_BRACKET_SIGN_CONVERTED);
				i++;
				break;

			case ')':
				escapedName.append(CLOSING_BRACKET_SIGN_CONVERTED);
				i++;
				break;

			default:
				escapedName.append(name.charAt(i));
			i++;

			}
		}

		return escapedName.toString();
	}

	/**
	 * Verifies whether this char is a hex char
	 * @param c
	 * @return
	 */
	private static  boolean isHex(char c){
		boolean hex = true;
		hex = !( Character.digit(c, 16) == -1);
		return hex;
	}

	/**
	 * Generates a search filter for finding a user, given the user's 
	 * name. 
	 * The searched name is escaped according to LDAP filters escaping rules.
	 * The checks on the searched name format should be done before escaping the value.
	 * @param name The user's name as provided by the Sametime client.
	 * @return The search filter, or null if the name is invalid. 
	 * */ 

	public static String peopleResolveFilter (String name) 
	{ 
		String escapedName;
		// prevent users from adding their own wildcards
		if (name.indexOf('*') != -1) 
			return null;

		// if name looks like email, do not search with wildcards, and only search in mail attribute 
		if (name.indexOf('@') != -1) 
		{
			escapedName = escape(name);
			return "(&(objectclass=person)(mail=" + escapedName + ")) ";
		}

		// otherwise, search as CN with wildcard
		escapedName = escape(name);
		return "(&(objectclass=person) (cn=" + escapedName + "*))";
	}
}

次のタスク

Java クラスを作成したら、このセクションのタスクを実行して、クラスを Sametime® コミュニティー・サーバーに組み込みます。