`
chilongxph
  • 浏览: 138438 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

ldap学习总结

阅读更多
一. LDAPContext
它提供了一种用来建立经过鉴别的或匿名的连接LDAP服务器的方法,和一些用于用于在目录中进行查询,比较,修改,删除条目的方法。
获取连接:
static final String adminName = "uid=root,o=HGC";
static final String adminPassword = "secret";
static final String ldapURL = "LDAP://210.0.144.136:389";
注:世纪应用中,上述属性一般要通过配置文件来获取。

public static LdapContext getLdapDirContext () throws NamingException {
LdapContext ctx = null;
try {
//properties extends Hashtable,所以其为一个map集合,另一种方式采用的则是set集合
Properties env = new Properties ( );
env.put ( Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory" );
env.put ( Context.SECURITY_AUTHENTICATION, "simple" );
env.put ( Context.SECURITY_PRINCIPAL, adminName );
env.put ( Context.SECURITY_CREDENTIALS, adminPassword );
// connect to my domain controller
env.put ( Context.PROVIDER_URL, ldapURL ); // Create the initial directory context
ctx = new InitialLdapContext ( env , null ); if ( ctx == null ) {
    System.out.println("获取连接失败");
throw new NamingException ( "Connect LDAP failed, Please contact administration!" );

}else{
    System.out.println("获取连接成功");
}
} catch ( NamingException ne ) {
   
throw ne;
}
return ctx;
}
获取经过鉴别的连接:
public boolean loginUserCheck(String dn, String password)
     {
     boolean flag = false;
   
     LdapContext ctx = null;
     try
     {
     Properties env = new Properties();
     env.put ( Context.INITIAL_CONTEXT_FACTORY,
     "com.sun.jndi.ldap.LdapCtxFactory" );
     env.put(Context.SECURITY_AUTHENTICATION, "simple");
     env.put(Context.SECURITY_PRINCIPAL,dn);
     env.put(Context.SECURITY_CREDENTIALS, password);
     // connect to my domain controller
     env.put(Context.PROVIDER_URL, "LDAP://210.0.144.136:389");
     // Create the initial directory context
     ctx = new InitialLdapContext(env, null);
     if(ctx!=null){          
     flag = true;
     }
     } catch (Exception e)
     {
     e.printStackTrace();
   
     } finally
     {
     LDAPManager.closeLdapContext(ctx);
     }
     return flag;
     }
二.添加条目
添加一个条目需要四步:
1. 创建条目属性,并把它们添加到属性集。
2. 指定将要创建的条目的DN。(dn:指定一条记录的位置)。
3. 通过dn和属性集合,创建一个ldap条目对象。
4. 调用LDAPContext的createSubcontext()方法把它加到目录中。
Eg: public boolean addEmail(Account account, LdapContext ctx)
            throws DaoException
    {
        boolean flag = false;
        //实现了attributes接口,attributes接口实现了cloneable接口
        BasicAttributes attrs = new BasicAttributes();
        String baseDN = "uid=" + account.getUid() + ",ou=" + account.getOu()
                + ",o=HGC";

        try
        {
//实现了attribute接口,attribute接口实现了cloneable接口
            BasicAttribute objclassSet = new BasicAttribute("objectclass");
            objclassSet.add("top");
            objclassSet.add("person");
            objclassSet.add("organizationalPerson");
            objclassSet.add("qmailUser");
            objclassSet.add("iPassRoamingUser");
            objclassSet.add("HGCBBUser");
            objclassSet.add("SpamUser");
            // objclassSet.add ( "WiFiUser" );
            attrs.put(objclassSet);

            attrs.put(Account.CN, account.getCn().trim());
            attrs.put(Account.SN, account.getSn().trim());
            attrs.put(Account.UID, account.getUid().trim());
            attrs.put(Account.CIRCUIT_ID, account.getCircuitID().trim());
            attrs.put(Account.OU, account.getOu().trim());
            attrs.put(Account.MAIL, account.getMail().trim());
            attrs.put(Account.USER_PASSWORD, account.getUserPassword().trim());
            attrs.put(Account.ACCOUNT_NUM, account.getAccountNum().trim());
            attrs.put(Account.MAIL_MESSAGE_STORE, account.getMailMessageStore()
                    .trim());
            attrs.put(Account.I_PASS_USERNAME, account.getIPassUsername()
                    .trim());

            attrs.put(Account.DELIVERY_MODE, account.getDeliveryMode().trim());
            attrs
                    .put(Account.ACCOUNT_STATUS, account.getAccountStatus()
                            .trim());
            attrs
                    .put(Account.ROAMING_STATUS, account.getRoamingStatus()
                            .trim());
            attrs.put(Account.ROAMING_ADMIN, account.getRoamingAdmin().trim());
            attrs.put(Account.ADMIN, account.getAdmin().trim());
            attrs.put(Account.DIALUP, account.getDialup().trim());
            attrs.put(Account.MAIL_HOST, account.getMailHost().trim());
            attrs.put(Account.MAIL_QUOTA, account.getMailQuota().trim());

            // new add attributes
            attrs.put(Account.XCHG_MAILBOX_TYPE, account.getXchgMailboxType()
                    .trim());
            attrs.put(Account.SPAM_STATUS, account.getSpamStatus().trim());
            attrs.put(Account.VIRUS_SCAN, account.getVirusScan().trim());
            attrs.put(Account.QUOTA_ALLOW_EXCEED, account.getQuotaAllowExceed()
                    .trim());
            attrs.put(Account.XCHG_MAILBOX_VAS, account.getXchgMailboxVas()
                    .trim());

            ctx.createSubcontext(baseDN, attrs);

            flag = true;
        } catch (Exception ex)
        {
            UtilTool.print(ex);
            throw new DaoException(ex);
        }

        return flag;
    }
三.删除条目
删除一个节点:分为两步:
1. 指定将要删除的条目的DN。
2. 调用LDAPContext. destroySubcontext()方法
Eg:public boolean dropCircuit ( Circuit modcir, LdapContext ctx ) throws DaoException {
boolean success = false;
try {
String BaseDN = "circuitID=" + modcir.getCircuitID ( ) + ",ou=circuitInfo," + Constant.BASE_DN;
ctx.destroySubcontext ( BaseDN );
success = true;
} catch ( Exception ex ) {
UtilTool.print ( ex.toString ( ) );
throw new DaoException ( ex );
}
return success;
}
四.修改条目信息
更新操作,需要三步走:
1. 获取要更新的条目的dn。
2. 获取要更新的条目的条目数组:ModificationItem对象。
3. 调用LDAPContext. modifyAttributes()方法
Eg:public boolean updateEmail(List<ModificationItem> modifyList,
            String modifyUid, String modifyOu, LdapContext ctx)
            throws DaoException
    {
        boolean flag = false;
        ModificationItem modificationItems[] = null;
        String baseDN = "uid=" + modifyUid + ",ou=" + modifyOu + ",o=HGC";
        int i = 0;

        try
        {
            modificationItems = new ModificationItem[modifyList.size()];
            for (Iterator<ModificationItem> it = modifyList.iterator(); it
                    .hasNext();)
            {
                modificationItems[i++] = it.next();
            }

            ctx.modifyAttributes(baseDN, modificationItems);

            flag = true;
        } catch (Exception ex)
        {
            UtilTool.print(ex);
            throw new DaoException(ex);
        }
        return flag;
}
五.查询条目信息


查询操作是ldap最重要,也是使用最多的操作。
查询要使用LDAPContext.search,当你执行一个Ldap查询方法时,你需要制定以下五种基本参数:
1. Search Base:它指定了你要从那条条目开始查询。例如:ou=hgcbroadband.com,o=HGC;空字符串表示从根目录开始查。
2. Search Scope:它指定你想查询的深度。
3. Search Filter:定义那些条目将被返回。不可为空!
4.Attribute List: 用来指定你想从查询获取的条目中返回的属性 ,默认情况下,返回所有属性。
5. types Only:指定你希望返回属性还是返回属性和值来指示属性集合。

Eg:public Account getAccountInfoByUid(String uid, String domain,
            String[] returnedAtts, boolean activeAccountOnly, LdapContext ctx)
            throws DaoException
    {
        Account account = null;
        // Create the search controls
        SearchControls searchCtls = new SearchControls();
        // initialize counter to total the group members
        // specify the LDAP search filter
        String searchFilter = "";
        if (activeAccountOnly)
        {
            searchFilter = "(&(mail=" + (uid + "@" + domain)+ ")(accountStatus=active)(objectClass=qmailUser))";
        } else
        {
            searchFilter = "(&(mail=" + (uid + "@" + domain)+ ")(objectClass=qmailUser))";
        }

        // Specify the Base for the search
        String searchBase = "ou=" + domain + "," + Constant.BASE_DN;

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

            // set return attributes
            if (returnedAtts != null && returnedAtts.length > 0)
            {
                searchCtls.setReturningAttributes(returnedAtts);
            }

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

            // Loop through the search results
            if (result != null && result.hasMoreElements())
            {
                account = new Account();
                account.seachResultToInfo(result.next());
            }
        } catch (NamingException ex)
        {
            UtilTool.print(ex);
            throw new DaoException(ex);
        }
        return account;
    }
分享到:
评论

相关推荐

    ldap技术总结的文档下载

    **LDAP技术概述** LDAP(Lightweight Directory Access Protocol)是一种轻量级目录访问协议,用于存储和检索...通过学习并实践上述知识点,开发者可以创建高效、安全的LDAP客户端,实现与各种LDAP服务器的无缝集成。

    ldap技术总结和开发文档

    以上就是关于“ldap技术总结和开发文档”的主要内容。深入理解和掌握这些知识点,对于在企业环境中实施和维护LDAP目录服务至关重要。在实际项目中,应结合具体需求,灵活运用这些理论知识,实现高效、稳定和安全的...

    LDAP技术,LDAP学习大全

    ### LDAP技术总结 #### 第一章 LDAP有关技术介绍 ##### 第一节 X.500目录服务 X.500目录服务是一种基于OSI网络协议的目录服务标准,它是LDAP(轻量级目录访问协议)的前身。X.500的核心在于提供一种全局性的目录...

    LDAP技术总结,入门到精通

    **LDAP技术总结** LDAP(Lightweight Directory Access Protocol)是一种用于访问和管理分布式目录服务的协议,它基于X.500标准,但设计得更为轻量级,适用于互联网环境。本教程将带你从入门到精通,全面理解LDAP的...

    ldap总结文档

    本文档集合了关于LDAP的安装、配置以及学习心得,旨在帮助读者深入理解并快速掌握这一技术。 ### LDAP基本概念 1. **目录服务**: LDAP是实现目录服务的一种标准协议,它允许用户通过统一的接口查找、修改和管理...

    php_ldap.dll集合

    总结来说,这个"php_ldap.dll集合"是针对PHP LDAP扩展的一个资源库,提供不同版本的`dll`文件以适应不同PHP环境和系统架构的需求。通过`DLL工具.exe`,用户可以检查和处理`.dll`文件问题,而`DLL之家.htm`提供了额外...

    LdapBrowser282.zip

    总结,LdapBrowser作为一款强大的LDAP工具,提供了全面的目录管理功能,无论是对初学者还是经验丰富的专业人士,都是一个值得信赖的助手。通过深入理解和熟练运用,我们可以更好地管理和利用基于LDAP的目录服务。

    Python 和 LDAP进行域认证

    **Python和LDAP进行域认证** 在信息技术领域,域认证是一种重要的身份验证机制,它允许用户在特定的网络环境中登录并访问资源...通过学习和理解这些知识,你可以构建更强大、更安全的系统,满足企业级的身份验证需求。

    jdbc连接 ldap jar 包

    总结来说,"jdbc连接 ldap jar 包"提供了一种使用Java和JDBC来操作LDAP目录的便捷方式,使得开发人员可以利用熟悉的SQL语句进行数据操作,提高了开发效率和可维护性。通过使用ldap.jar和jdbcLdap.jar,我们可以轻松...

    ldap_SpringBoot.zip

    **LDAP与SpringBoot集成详解** 在现代企业级应用中,身份验证和授权是核心功能之一。LDAP(Lightweight Directory Access Protocol...在提供的`ldap_demo`中,包含了完整的示例代码,可以作为进一步学习和实践的基础。

    spring ldap 1.3.0下载

    1. **易于使用**:Spring LDAP 提供了一种面向对象的方式来处理LDAP数据,使得无需直接处理复杂的LDAP语法,从而降低了学习曲线。 2. **与Spring Framework集成**:Spring LDAP 完全融入Spring的IoC(Inversion of ...

    LDAP实用资料收录.doc

    **LDAP实用资料收录** 本文档将深入探讨Lightweight Directory Access Protocol (LDAP)的相关知识,包括其基础概念...通过对LDAP的深入学习,我们可以更好地利用这一工具来满足组织的需求,并提升整体的系统集成能力。

    jndi.zip_java ldap_jndi_jndi ldap_ldap_ldap java

    总结来说,JNDI和LDAP的结合使得Java开发者能轻松地管理和操作分布式目录服务,为企业的身份验证、授权和数据管理提供了强大支持。学习并熟练掌握这两者之间的交互对于提升Java应用的复杂性和可扩展性至关重要。通过...

    实际WEB项目整合 Shiro 以及 LDAP 方案.docx

    总结,通过整合 Shiro 和 LDAP,我们可以构建一个高效、安全的 Web 项目身份验证系统。Shiro 提供了便捷的认证和授权管理,而 LDAP 则作为一个集中式身份验证源,确保了用户凭证的安全存储和验证。这样的解决方案既...

    用C语言开发交互学习网络平台上的LDAP认证.pdf

    根据提供的文件内容,以下是对“用C语言开发交互学习网络平台上的LDAP认证”的知识点总结: ### LDAP技术基础 LDAP(轻量级目录访问协议)是一种用于访问和维护分布式目录信息服务的协议。它广泛应用于各种信息系统...

    ldap.rar_RDBMS_ldap

    **LDAP(Lightweight Directory Access Protocol)轻量级目录访问协议** LDAP是一种开放标准的网络协议,用于访问和..."www.pudn.com.txt"和"ldap"这两个文件可能是相关的文本资料或代码示例,供进一步学习和研究。

    ldap c# 测试工具以及源代码(vs2010 winform .net2.0)

    总结来说,这个压缩包提供的是一种使用C#开发的、基于WinForms的 LDAP 测试工具,适用于Visual Studio 2010,并且使用了.NET Framework 2.0。它具有验证Active Directory用户身份的功能,通过图形界面与用户交互,且...

    CAS整合LDAP实现单点登录学习笔记.pdf

    #### 五、总结 通过CAS与LDAP的整合,不仅可以实现高效、安全的单点登录机制,还可以简化用户和权限管理,提升系统的整体安全性和用户体验。这种整合方式在现代企业的IT环境中非常常见,特别是在那些拥有多个独立...

    3.3.01_LDAP_Java_API_使用指南

    总结,Java API for LDAP通过JNDI提供了一套全面的工具,使得Java开发者能够在其应用程序中轻松地与LDAP服务器交互。通过学习和实践,开发者可以掌握创建、读取、更新和删除LDAP目录中的数据,以及执行更高级的操作...

Global site tag (gtag.js) - Google Analytics