2017-03-09 16 views
0

ローカルマシン上の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))が含まれます

LDAPS server snapshot

私は、ユーザーがldapSettingModel.getFilter()を使用して、追加の検索フィルタを追加できるようにしようとしている、値は私が使用して検索してみました:

  1. (CN =インド):最終searchFilter - >(&(objectClassの= *)(UID =バイバブ)(CN =インド))
  2. (objectClassの= postalAddressの)(CN = インド) :最終searchFilter - >(&(objectClassの= *)(UID =バイバブ)(objectClassの= postalAddressの)(CN = インド))私が正しく追加検索をかけていた場合

私はわからないんだけどフィルターを使用していますが、getUserDetailsFromLDAP()メソッドのNamingEnumeration<SearchResult> answerがnullになります。私がLDAPに慣れていないので何か間違っていると私を案内してください。

答えて

1
(&(objectClass=*)(uid=vaibhav)(cn=India)) 

これは意味をなさない。 cnは 'common name'の略です。共通名が「インド」のユーザーはいません。あなたがユーザーを探しているよう

それはあなたが言及して第二の代替がさらに少ない理にかなって

(&(objectClass=inetOrgPerson)(uid=vaibhav)(postalAddress=India)) 

可能性が実際に

(&(objectClass=*)(uid=vaibhav)(postalAddress=India)) 

をする必要があります。

+0

クイックソリューションをありがとう、実際に私はsearchFilterを追加するために書いたコードが動作するかどうかをテストしたかったのです。しかし、私はそれがどのように機能するかについてほとんど知識がないので、私は無作為に何かを試していました。説明をもう一度ありがとう...! – VPK

関連する問題