一. 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(Lightweight Directory Access Protocol)是一种轻量级目录访问协议,用于存储和检索...通过学习并实践上述知识点,开发者可以创建高效、安全的LDAP客户端,实现与各种LDAP服务器的无缝集成。
以上就是关于“ldap技术总结和开发文档”的主要内容。深入理解和掌握这些知识点,对于在企业环境中实施和维护LDAP目录服务至关重要。在实际项目中,应结合具体需求,灵活运用这些理论知识,实现高效、稳定和安全的...
### LDAP技术总结 #### 第一章 LDAP有关技术介绍 ##### 第一节 X.500目录服务 X.500目录服务是一种基于OSI网络协议的目录服务标准,它是LDAP(轻量级目录访问协议)的前身。X.500的核心在于提供一种全局性的目录...
**LDAP技术总结** LDAP(Lightweight Directory Access Protocol)是一种用于访问和管理分布式目录服务的协议,它基于X.500标准,但设计得更为轻量级,适用于互联网环境。本教程将带你从入门到精通,全面理解LDAP的...
本文档集合了关于LDAP的安装、配置以及学习心得,旨在帮助读者深入理解并快速掌握这一技术。 ### LDAP基本概念 1. **目录服务**: LDAP是实现目录服务的一种标准协议,它允许用户通过统一的接口查找、修改和管理...
总结来说,这个"php_ldap.dll集合"是针对PHP LDAP扩展的一个资源库,提供不同版本的`dll`文件以适应不同PHP环境和系统架构的需求。通过`DLL工具.exe`,用户可以检查和处理`.dll`文件问题,而`DLL之家.htm`提供了额外...
总结,LdapBrowser作为一款强大的LDAP工具,提供了全面的目录管理功能,无论是对初学者还是经验丰富的专业人士,都是一个值得信赖的助手。通过深入理解和熟练运用,我们可以更好地管理和利用基于LDAP的目录服务。
**Python和LDAP进行域认证** 在信息技术领域,域认证是一种重要的身份验证机制,它允许用户在特定的网络环境中登录并访问资源...通过学习和理解这些知识,你可以构建更强大、更安全的系统,满足企业级的身份验证需求。
总结来说,"jdbc连接 ldap jar 包"提供了一种使用Java和JDBC来操作LDAP目录的便捷方式,使得开发人员可以利用熟悉的SQL语句进行数据操作,提高了开发效率和可维护性。通过使用ldap.jar和jdbcLdap.jar,我们可以轻松...
**LDAP与SpringBoot集成详解** 在现代企业级应用中,身份验证和授权是核心功能之一。LDAP(Lightweight Directory Access Protocol...在提供的`ldap_demo`中,包含了完整的示例代码,可以作为进一步学习和实践的基础。
1. **易于使用**:Spring LDAP 提供了一种面向对象的方式来处理LDAP数据,使得无需直接处理复杂的LDAP语法,从而降低了学习曲线。 2. **与Spring Framework集成**:Spring LDAP 完全融入Spring的IoC(Inversion of ...
**LDAP实用资料收录** 本文档将深入探讨Lightweight Directory Access Protocol (LDAP)的相关知识,包括其基础概念...通过对LDAP的深入学习,我们可以更好地利用这一工具来满足组织的需求,并提升整体的系统集成能力。
总结来说,JNDI和LDAP的结合使得Java开发者能轻松地管理和操作分布式目录服务,为企业的身份验证、授权和数据管理提供了强大支持。学习并熟练掌握这两者之间的交互对于提升Java应用的复杂性和可扩展性至关重要。通过...
总结,通过整合 Shiro 和 LDAP,我们可以构建一个高效、安全的 Web 项目身份验证系统。Shiro 提供了便捷的认证和授权管理,而 LDAP 则作为一个集中式身份验证源,确保了用户凭证的安全存储和验证。这样的解决方案既...
根据提供的文件内容,以下是对“用C语言开发交互学习网络平台上的LDAP认证”的知识点总结: ### LDAP技术基础 LDAP(轻量级目录访问协议)是一种用于访问和维护分布式目录信息服务的协议。它广泛应用于各种信息系统...
**LDAP(Lightweight Directory Access Protocol)轻量级目录访问协议** LDAP是一种开放标准的网络协议,用于访问和..."www.pudn.com.txt"和"ldap"这两个文件可能是相关的文本资料或代码示例,供进一步学习和研究。
总结来说,这个压缩包提供的是一种使用C#开发的、基于WinForms的 LDAP 测试工具,适用于Visual Studio 2010,并且使用了.NET Framework 2.0。它具有验证Active Directory用户身份的功能,通过图形界面与用户交互,且...
#### 五、总结 通过CAS与LDAP的整合,不仅可以实现高效、安全的单点登录机制,还可以简化用户和权限管理,提升系统的整体安全性和用户体验。这种整合方式在现代企业的IT环境中非常常见,特别是在那些拥有多个独立...
总结,Java API for LDAP通过JNDI提供了一套全面的工具,使得Java开发者能够在其应用程序中轻松地与LDAP服务器交互。通过学习和实践,开发者可以掌握创建、读取、更新和删除LDAP目录中的数据,以及执行更高级的操作...