【问题标题】:How to connect with Java into Active Directory如何使用 Java 连接到 Active Directory
【发布时间】:2012-01-23 00:30:34
【问题描述】:

我正在使用Weblogic,Ejb3.0。 Java 1.6

我需要通过 Java 代码访问 Active Directory。 我阅读了几种方法(Kerberos、LDAP)

任何人都可以建议我以舒适的方式这样做吗?我在哪里可以有一些完整的代码示例,

谢谢, 射线。

【问题讨论】:

  • 您要访问 AD 做什么? Kerberos 通常仅限于身份验证(尽管 AD 的 Kerberos 票证也包含它们自己的一些扩展,您可能会发现很难从 Java 中读取这些扩展)。 LDAP 也可以进行身份​​验证,但它也是一个包含有关用户的更多信息的目录。主要区别在于您可以将 Kerberos 用于 SSO。
  • 更准确地了解您真正想要的内容。

标签: java jakarta-ee active-directory ldap kerberos


【解决方案1】:

【讨论】:

  • 那么我应该决定使用 LDAP 还是 Kerberos?可能是我尝试访问的 Active Directory 不支持 Kerberos?
  • 我对 Kerberos tbh 不太熟悉。您只是针对 AD 进行身份验证,还是做更多事情,例如读/写数据?如果是第二个可能是 LDAP,如果是第一个,不太确定。
  • @rayman:Kerberos 是关于身份验证和授权的。如果您只想访问存储在目录中的某些信息,请使用 LDAP。您的问题有点笼统,也许您可​​以概述一下您的要求。
  • @home,Kerberos 只是关于身份验证,而不是授权(尽管 AD 的 Kerberos 票证中有一些非标准扩展)。使用 Kerberos 进行身份验证时,通常使用 LDAP 来获取更多属性。
  • @bruno:谢谢,我不知道它不支持授权。尽管如此,仍然不清楚 OP 真正需要什么。
【解决方案2】:

这是一个在 W2K3 上使用 JNDI 进行身份验证和进行 LDAP 搜索的简单代码:

class TestAD
{
  static DirContext ldapContext;
  public static void main (String[] args) throws NamingException
  {
    try
    {
      System.out.println("Début du test Active Directory");

      Hashtable<String, String> ldapEnv = new Hashtable<String, String>(11);
      ldapEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
      //ldapEnv.put(Context.PROVIDER_URL,  "ldap://societe.fr:389");
      ldapEnv.put(Context.PROVIDER_URL,  "ldap://dom.fr:389");
      ldapEnv.put(Context.SECURITY_AUTHENTICATION, "simple");
      //ldapEnv.put(Context.SECURITY_PRINCIPAL, "cn=administrateur,cn=users,dc=societe,dc=fr");
      ldapEnv.put(Context.SECURITY_PRINCIPAL, "cn=jean paul blanc,ou=MonOu,dc=dom,dc=fr");
      ldapEnv.put(Context.SECURITY_CREDENTIALS, "pwd");
      //ldapEnv.put(Context.SECURITY_PROTOCOL, "ssl");
      //ldapEnv.put(Context.SECURITY_PROTOCOL, "simple");
      ldapContext = new InitialDirContext(ldapEnv);

      // Create the search controls         
      SearchControls searchCtls = new SearchControls();

      //Specify the attributes to return
      String returnedAtts[]={"sn","givenName", "samAccountName"};
      searchCtls.setReturningAttributes(returnedAtts);

      //Specify the search scope
      searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);

      //specify the LDAP search filter
      String searchFilter = "(&(objectClass=user))";

      //Specify the Base for the search
      String searchBase = "dc=dom,dc=fr";
      //initialize counter to total the results
      int totalResults = 0;

      // Search for objects using the filter
      NamingEnumeration<SearchResult> answer = ldapContext.search(searchBase, searchFilter, searchCtls);

      //Loop through the search results
      while (answer.hasMoreElements())
      {
        SearchResult sr = (SearchResult)answer.next();

        totalResults++;

        System.out.println(">>>" + sr.getName());
        Attributes attrs = sr.getAttributes();
        System.out.println(">>>>>>" + attrs.get("samAccountName"));
      }

      System.out.println("Total results: " + totalResults);
      ldapContext.close();
    }
    catch (Exception e)
    {
      System.out.println(" Search error: " + e);
      e.printStackTrace();
      System.exit(-1);
    }
  }
}

【讨论】:

  • 对于 SECURITY_PRINCIPAL 值,我能够让电子邮件地址代替“cn=jean paul blanc,ou=MonOu,dc=dom,dc=fr”之类的 DN。这对我来说更可取,因为我知道我的电子邮件地址,但不知道我的 DN。
【解决方案3】:

您可以使用 DDC(域目录控制器)。 它是一个新的、易于使用的 Java SDK。您甚至不需要了解 LDAP 即可使用它。相反,它公开了一个面向对象的 API。

您可以找到它here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 2014-01-06
    • 2019-03-21
    • 1970-01-01
    相关资源
    最近更新 更多