2017-01-17 48 views
0

我使用此代碼檢索ldap用戶的組信息。獲取LDAP用戶組的彈簧

 String ldapUri = this.url; 
     Hashtable env = new Hashtable(); 
     env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
     env.put(Context.PROVIDER_URL, ldapUri); 
     env.put(Context.SECURITY_AUTHENTICATION, "simple"); 
     env.put(Context.SECURITY_PRINCIPAL, this.managerDn); 
     env.put(Context.SECURITY_CREDENTIALS, this.managerPassword); 
     try { 
      LdapContext ctx = new InitialLdapContext(env,null); 
      SearchControls ctls = new SearchControls(); 
      String[] attributes = {"memberOf"}; 
      ctls.setReturningAttributes(attributes); 
      ctls.setSearchScope(SearchControls.SUBTREE_SCOPE); 
      NamingEnumeration<?> answer = ctx.search("dc=abc,dc=com", "(&(objectclass=user)(sAMAccountName=xxxx))", ctls); 

      **//At this point, I can see the values that I am expecting under entries of answer but hasMoreElements() returns false!** 

      while(answer.hasMoreElements()) { 
       SearchResult rslt = (SearchResult) answer.next(); 
       Attributes attrs = rslt.getAttributes(); 
       String groups = attrs.get("cn").toString(); 
       String [] groupname = groups.split(":"); 
       String userGroup = groupname[1]; 
       System.out.println(attrs.get("cn")); 
      } 
     } 
     catch(Exception e) { 
      e.printStackTrace(); 
     } 

answer.hasMoreElements()返回false。但是,我可以在調試時看到我在答案對象條目下預期的值。有人能告訴我我錯過了什麼嗎?

如果這不是正確的方法,我該如何獲得ldap用戶所在的組?

回答

0

由於sAMAccountName在上下文中是唯一的,因此您不應期望結果中有多個條目。您必須檢索memberOf屬性值以瞭解組。

+0

此答案如何幫助解決所述問題? – marthursson

+0

我認爲'hasMoreElements()'的第一次執行可以正常工作,但是attrs.get(「cn」)'將返回null,並且'toString()'將會彈出。這是應該處理的'memberOf'屬性。顯然,我沒有完成答案而提交了答案。抱歉。 – marabu

+0

問題指出hasMoreElements返回false – marthursson

0

hasMoreElements方法默默吞下可能發生的任何異常。我很確定在試圖獲取結果的引擎蓋下出現問題。

嘗試使用hasMore方法,因爲這會暴露可能發生的任何潛在異常。

+0

也嘗試過。但沒有奏效。沒有任何異常拋出。 –