5
私はLDAPとシンプルなデータベース認証の両方を使用してユーザーをログインするアプリケーションを持っています。ユーザーがLDAPコンテキストに存在しない場合のみ、アプリケーションはデータベースに存在するかどうかを確認します。パスワードを知らなくても、ユーザーがLDAPに存在するかどうかを確認する方法が必要です。ユーザー名は一意であると言います。指定したユーザー名が存在するかどうかを確認するにはどうすればよいですか?
私はこのコードを使用します。これは正しいユーザー名とパスワードがあれば動作します。パスワードまたはユーザー名が間違っている場合は、例外が発生します。ユーザー名が存在しない場合は1つ、入力されたパスワードが間違っている場合は別の例外を得ることができれば理想的です。
String username = "test";
String password = "pass";
Hashtable<String, String> environment = new Hashtable<String, String>();
environment.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
environment.put(Context.PROVIDER_URL, "ldap://server.example.com:389");
environment.put(Context.SECURITY_AUTHENTICATION, "simple");
String user = username + "@example.com";
environment.put(Context.SECURITY_PRINCIPAL, user);
environment.put(Context.SECURITY_CREDENTIALS, password);
try
{
DirContext context = new InitialDirContext(environment);
String searchBase = "DC=server,DC=example,DC=COM";
String FILTER = "(&(objectClass=user)(objectCategory=person)((sAMAccountName=" + username + ")))";
SearchControls ctls = new SearchControls();
ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);
NamingEnumeration<SearchResult> answer = context.search(searchBase, FILTER, ctls);
SearchResult result = answer.next();
Attribute email = result.getAttributes().get("mail");
Attribute cn = result.getAttributes().get("cn");
System.out.println(cn + " : " + email);
context.close();
}
catch (AuthenticationException a)
{
Logger.getLogger().info("Authentication failed: " + a.getExplanation());
}
catch (NamingException e)
{
Logger.getLogger().info("Failed to bind to LDAP: " + e.getExplanation());
}
ありがとうございました。これは唯一の方法ですか?検索を行うためにはログインする必要がありますか? – radonys
多分、私は知らない。私はあなたの*コードがLDAPに存在するかどうかをチェックするためにユーザのパスワードが必要な理由を説明しています。 –
一部の管理者は匿名検索を許可します。ディレクトリ・サーバー管理者に確認してください。 –