ローカルマシン上のSSLを介してLDAPサーバーを使用し、アプリケーションから同じマシンからLDAPサーバーを接続しています。以下のLDAPサーバーを接続するためのコードです:私はldapSettingModel.getFilter()
を使用して検索フィルタを追加しようとするまでLDAPに追加の検索クエリを適用する方法
// Specify the search scope
final String returnedAtts[] = { ldapSettingModel.getDepartment(),
ldapSettingModel.getEmailId(), ldapSettingModel.getLocation(),
ldapSettingModel.getRole(), ldapSettingModel.getDispName() };
String searchFilter = "(&(objectClass=*)(" + ldapSettingModel.getLoginId() + "=" + user
+ ")" + ldapSettingModel.getFilter() + ")";
String adPrincipal = user;
if (CATAppConstants.ACTIVE_DIRECTORY_WIN_2000_ATTR.equals(ldapSettingModel.getLoginId())) {
// with domain
if (user.indexOf("\\") > 0) {
user = user.substring(user.indexOf("\\") + 1);
searchFilter = "(&(objectClass=*)(" + ldapSettingModel.getLoginId() + "=" + user
+ ")" + ldapSettingModel.getFilter() + ")";
} else {
String[] pDN = ldapSettingModel.getBaseDNName().split(",");
for (String dn : pDN) {
if (dn.indexOf("dc=") == 0) {
adPrincipal = dn.substring(3) + "\\" + adPrincipal;
break;
}
}
}
}
// Create the search controls
SearchControls searchCtls = new SearchControls();
searchCtls.setReturningAttributes(returnedAtts);
searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
String ldapProtocol = "ldap" + (ldapSettingModel.getSslFlg() == 1 ? "s" : "");
String providerUrl = ldapProtocol + "://" + ldapSettingModel.getHost() + ":"
+ ldapSettingModel.getPortNo();
Hashtable<String, String> env = new Hashtable<String, String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, providerUrl);
if (ldapSettingModel.getSslFlg() == 1) {
env.put(Context.SECURITY_PROTOCOL, "ssl");
env.put("java.naming.ldap.factory.socket",
"com.shift.tcm.serviceCust.authenticationManagement.CustomSSLSocketFactory");
}
env.put(Context.SECURITY_AUTHENTICATION, "simple");
switch (ldapSettingModel.getLdapType()) {
case CATAppConstants.DIRECTORY_TYPE_IS_ACTIVE_DIRECTORY:
env.put(Context.SECURITY_PRINCIPAL, adPrincipal);
break;
default:
env.put(Context.SECURITY_PRINCIPAL, ldapSettingModel.getLoginId() + "=" + user + ","
+ ldapSettingModel.getBaseDNName());
break;
}
env.put(Context.SECURITY_CREDENTIALS, requestPassword);
env.put("com.sun.jndi.ldap.connect.timeout", CATAppConstants.LDAP_CONNECT_TIMEOUT + "");
LdapContext ctxGC = null;
MstUserModel userDetails = null;
// This is the actual Authentication piece. Will throw
// javax.naming.AuthenticationException
// if the users password is not correct. Other exceptions may
// include IO (server not found) etc.
ctxGC = new InitialLdapContext(env, null);
// Now try a simple search and get some attributes as defined in
// returnedAtts
NamingEnumeration<SearchResult> answer = ctxGC.search(ldapSettingModel.getBaseDNName(),
searchFilter, searchCtls);
userDetails = getUserDetailsFromLDAP(answer, ldapSettingModel, checkDetailsOnly,
currentRoleName);
userDetails.setLoginId(user);
すべてが正常に動作します。通常はそれなしで、検索フィルタは、次のLDAPサーバ用の(&(objectClass=*)(uid=vaibhav))
が含まれます
私は、ユーザーがldapSettingModel.getFilter()
を使用して、追加の検索フィルタを追加できるようにしようとしている、値は私が使用して検索してみました:
- (CN =インド):最終
searchFilter
- >(&(objectClassの= *)(UID =バイバブ)(CN =インド)) - (objectClassの= postalAddressの)(CN = インド) :最終
searchFilter
- >(&(objectClassの= *)(UID =バイバブ)(objectClassの= postalAddressの)(CN = インド))私が正しく追加検索をかけていた場合
私はわからないんだけどフィルターを使用していますが、getUserDetailsFromLDAP()
メソッドのNamingEnumeration<SearchResult> answer
がnullになります。私がLDAPに慣れていないので何か間違っていると私を案内してください。
クイックソリューションをありがとう、実際に私はsearchFilterを追加するために書いたコードが動作するかどうかをテストしたかったのです。しかし、私はそれがどのように機能するかについてほとんど知識がないので、私は無作為に何かを試していました。説明をもう一度ありがとう...! – VPK