LDAP操作代码样例 初始化LDAP 目录服务上下文
该例子中,我们使用uid=linly,ou=People,dc=jsoso,dc=net这个账号,链接位于本机8389端口的LDAP服务器(ldap://localhost:8389),认证方式采用simple类型,即用户名/密码方式。
private static void initialContext() throws NamingException{
if(singleton == null){
singleton = new LDAPConnection();
/*
* 在实际编码中,这些环境变量应尽可能通过配置文件读取
*/
//LDAP服务地址
singleton.sLDAP_URL = "ldap://localhost:8389";
//管理员账号
singleton.sMANAGER_DN = "uid=linly,ou=People,dc=jsoso,dc=net";
//管理员密码
singleton.sMANAGER_PASSWORD = "coffee";
//认证类型
singleton.sAUTH_TYPE = "simple";
//JNDI Context工厂类
singleton.sCONTEXT_FACTORY = "com.sun.jndi.ldap.LdapCtxFactory";
singleton.envProps.setProperty(Context.INITIAL_CONTEXT_FACTORY, singleton.sCONTEXT_FACTORY);
singleton.envProps.setProperty(Context.PROVIDER_URL, singleton.sLDAP_URL);
singleton.envProps.setProperty(Context.SECURITY_AUTHENTICATION, singleton.sAUTH_TYPE);
singleton.envProps.setProperty(Context.SECURITY_PRINCIPAL, singleton.sMANAGER_DN);
singleton.envProps.setProperty(Context.SECURITY_CREDENTIALS, singleton.sMANAGER_PASSWORD);
/*
* 绑定ldap服务器
*/
singleton.dirCtx = new InitialDirContext(singleton.envProps);
}
}
通过一个Hashtable或者Properties对象为LDAP的Context设置参数,而后初始化InitialDirContext,即可绑定LDAP服务。这相当于JDBC中获取数据库的Connection对象。
绑定/创建LDAP条目对象
用户可以使用bind方法创建新的LDAP条目,下面的代码创建一个DN:"ou=Employee , dc=jsoso ,dc=net"的OrganizationUnit类LDAP条目如下:
public boolean createOrganizationUnit(){
String ldapGroupDN = "ou=Employee , dc=jsoso ,dc=net";
try {
/*
* 查找是否已经存在指定的OU条目
* 如果存在,则打印OU条目的属性信息
* 如果不存在,则程序会抛出NamingException异常,进入异常处理
*/
Attributes attrs = dirContext.getAttributes(ldapGroupDN);
System.out.println("Find the group , attributes list :");
NamingEnumeration<String> nEnum = attrs.getIDs();
for( ; nEnum.hasMore() ; ){
String attrID = nEnum.next();
Attribute attr = (Attribute)attrs.get(attrID);
System.out.println(attr.toString());
}
return false;
} catch (NamingException e) {
/*
* 没有找到对应的Group条目,新增Group条目
*/
//创建objectclass属性
Attribute objclass = new BasicAttribute("objectclass");
objclass.add("top");
objclass.add("organizationalunit");
//创建cn属性
Attribute cn = new BasicAttribute("ou", "Employee");
//创建Attributes,并添加objectclass和cn属性
Attributes attrs = new BasicAttributes();
attrs.put(objclass);
attrs.put(cn);
//将属性绑定到新的条目上,创建该条目
try {
dirContext.bind(ldapGroupDN, null, attrs);
System.out.println("Group created successful");
return true;
} catch (NamingException e1) {
e1.printStackTrace();
}
}
return false;
}
获取条目属性
下面一段代码获取entryDN参数指定条目中的属性集合,并打印到控制台
/**
* 获取一个指定的LDAP Entry
* @param entryDN
*/
public void find(String entryDN){
try {
Attributes attrs = dirContext.getAttributes(entryDN);
if (attrs != null) {
NamingEnumeration<String> nEnum = attrs.getIDs();
for( ; nEnum.hasMore() ; ){
String attrID = nEnum.next();
Attribute attr = (Attribute)attrs.get(attrID);
System.out.println(attr.toString());
}
System.out.println();
}else{
System.out.println("No found binding.");
}
}catch(NamingException ne) {
ne.printStackTrace();
}
}
修改条目属性
修改DN=user.getDistinguishedName()的条目中的cn、givenname、sn和userpassword四个属性值。
(注:参数DirContext.REPLACE_ATTRIBUTE有另外两个常量:DirContext.ADD_ATTRIBUTE;DirContext.REMOVE_ATTRIBUTE,分别表示新增属性和删除属性。)
/**
* 修改用户信息
* @param user
* @return
* @throws Exception
*/
public boolean modifyUser(LDAPUser user) throws Exception {
//用户对象为空
if (user == null) {
throw new Exception("No user information!n");
}
//检查uid
String userDN = user.getDistinguishedName();
if (userDN == null && userDN.length() == 0) {
throw new NamingException("No userDN you specify!n");
}
//判断用户条目是否已经存在
if(!isUserexist(userDN)){
return false;
}
//设置属性
Attributes attrs = new BasicAttributes();
setBasicAttribute(attrs, "cn", user.getCommomName());
setBasicAttribute(attrs, "givenname", user.getFirstName());
setBasicAttribute(attrs, "sn", user.getLastName());
setBasicAttribute(attrs, "userpassword", user.getPassword());
//修改属性
try{
dirContext.modifyAttributes(user.getDistinguishedName(),DirContext.REPLACE_ATTRIBUTE, attrs);
System.out.println("User(" + user.getDistinguishedName() + ") information modified.n");
return true;
}catch(NamingException ne){
ne.printStackTrace();
}
return false;
}
根据属性集搜索条目
根据属性集matchingAttributes中的匹配值,在上下文DN= "ou=People,dc=jsoso ,dc=net"中搜索它的所有子树中的匹配条目。
(注:SearchControls的SCOPE参数详见SearchControls SCOPE补充说明)
/**
* 通过属性搜索LDAP范例
* @return
*/
public void searchByAttribute(Attributes matchingAttributes){
String baseDN = "ou=People,dc=jsoso ,dc=net";
SearchControls cons = new SearchControls();
cons.setSearchScope(SearchControls.SUBTREE_SCOPE);
try {
Name baseName = new LdapName(baseDN);
NamingEnumeration<SearchResult> ne = dirContext.search(baseName, matchingAttributes);
SearchResult entry = null;
for(;ne.hasMore();){
entry = ne.next();
showEntry(entry);
}
} catch (NamingException e) {
e.printStackTrace();
}
}
根据过滤器搜索条目
根据过滤器条件,在上下文DN = "ou=People,dc=jsoso ,dc=net"中,搜索它的所有子树中的匹配条目。
(注:过滤器filter的相关语法详见LDAP filter语法补充说明)
/**
* 通过过滤器搜索LDAP范例
* @return
*/
public void searchByFilter(String filter){
String baseDN = "ou=People,dc=jsoso ,dc=net";
SearchControls cons = new SearchControls();
cons.setSearchScope(SearchControls.SUBTREE_SCOPE);
try {
NamingEnumeration<SearchResult> ne = dirContext.search(baseDN, filter , cons);
SearchResult entry = null;
for(;ne.hasMore();){
entry = ne.next();
showEntry(entry);
}
} catch (NamingException e) {
e.printStackTrace();
}
文章来源:http://hi.baidu.com/millionware/blog/
分享到:
相关推荐
LDAP代码操作Demo,LDAP操作代码样例 初始化LDAP 目录服务上下文、绑定/创建LDAP条目对象、获取条目属性、修改条目属性等实例
本示例项目 "spring-ldap demo" 提供了一个关于如何使用 Spring LDAP 进行实际操作的详细教程,包括与 LDAP 目录的增删查改操作,并结合了 EXT.js 进行前端展示。 首先,我们来了解一下 Spring LDAP 的核心概念。...
**LDAP与SpringBoot集成详解** 在现代企业级应用中,身份验证和授权是核心功能之一。LDAP(Lightweight Directory Access Protocol...在提供的`ldap_demo`中,包含了完整的示例代码,可以作为进一步学习和实践的基础。
5. **PHP LDAP库**:在PHP中,可以使用`ldap_*`函数系列与LDAP服务器进行交互,例如`ldap_connect`建立连接,`ldap_bind`进行身份验证,`ldap_search`查询目录,以及`ldap_mod_add`、`ldap_mod_replace`等操作数据。...
开发者可以通过下载 "shiro-demo" 文件,导入到 IDE 中运行,查看其如何处理登录、权限检查等操作。通过阅读代码,可以了解 Shiro 如何与后端控制器、数据库及前端交互,从而在自己的项目中应用类似的安全机制。 ...
**LDAP:轻量级目录访问协议** LDAP(Lightweight Directory Access...通过这个小demo,你可以深入理解LDAP的基本操作和在实际项目中的应用。在学习过程中,建议结合具体的代码和文档来实践,以更好地掌握LDAP的使用。
提供的压缩包`SpringLDAPClient`是一个基于Eclipse的项目,包含示例代码来演示上述操作。导入该项目后,你可以编译并运行,观察Spring LDAP和JNDI如何实现对LDAP目录的CRUD操作。 ### 结语 理解并熟练使用Spring ...
在"delphi for adsi demo 代码"中,我们可以探索以下几个关键知识点: 1. **ADSI对象模型**:ADSI定义了一种统一的对象模型,使得开发者可以通过统一的接口与不同的目录服务进行交互。这些对象包括用户、计算机、组...
CAS(Central Authentication Service)是一种广泛使用的开放源代码的单点登录(Single Sign-On,SSO)系统,主要用于网络应用的集中身份验证。在本项目中,我们关注的是CAS 4.1.x版本,它集成了MySQL数据库、LDAP...
在这个"修改AD域密码及新增账号demo.zip"压缩包中,我们看到的是一个基于Java操作LDAP(轻量级目录访问协议)来与AD域进行交互的示例代码,目的是为了演示如何修改AD用户的密码以及如何新增AD账号。 首先,理解Java...
9. **JNDIDemo**:提供的`JNDIDemo`可能是一个示例程序,展示了如何使用JNDI进行查找、绑定等操作。通过查看源代码和运行示例,可以深入理解JNDI的工作原理。 10. **学习资料**:提供的文档,如`java的JNDI 技术...
ElasticSearch(`基本操作和高级查询`)、Async(`异步任务`)、集成Dubbo(`采用官方的starter`)、MongoDB(`文档数据库`)、neo4j(`图数据库`)、docker(`容器化`)、`JPA多数据源`、`Mybatis多数据源`、`代码生成器`、Gray...
通常,这涉及到检查`Subject`中的权限或角色,以确定用户是否被允许执行特定操作。 `JaasDemo`可能是该示例项目的主要类,它演示了上述流程。在这个例子中,可能包含以下关键部分: - 一个自定义的登录模块实现,...
- **Realms** - 实现了特定数据源的认证和授权逻辑,比如从数据库或LDAP获取用户信息。你需要创建一个自定义的Realm,并配置对应的认证和授权算法。 - **Session Management** - Shiro提供了会话管理,可以在不依赖...
Realms是Shiro与应用特定安全数据源(如数据库、LDAP等)的桥梁,负责从数据源获取身份验证和授权信息。Cryptography组件则提供加密服务,确保敏感信息的安全存储和传输。Session管理则是Shiro处理会话数据的方式,...
- 安全API:Shiro 提供了一系列的静态工具类,方便在代码中进行安全相关的操作。 通过这个完整的 Realm Demo,你可以学习到如何将Shiro与实际应用相结合,实现一套完整的用户认证和授权系统。这不仅有助于理解...
ElasticSearch(基本操作和高级查询)、Async(异步任务)、集成Dubbo(采用官方的starter)、MongoDB(文档数据库)、neo4j(图数据库)、docker(容器化)、JPA多数据源、Mybatis多数据源、代码生成器、GrayLog(日志收集)、...
开发者可以自定义认证提供者,以适应特定的应用场景,比如与LDAP服务器或自定义数据库进行交互进行身份验证。 **2. 授权(Authorization)** 授权是决定一个经过认证的用户是否有权限执行某个操作的过程。Spring ...
在"pcMsg"这个文件中,可能包含了项目的源代码、配置文件等,通过查看这些文件,我们可以深入理解Shiro如何在实际项目中被运用,包括登录验证的具体实现、权限拦截的逻辑以及如何配置和扩展Shiro。通过这个demo,...
【linphoneC#demo.7z】是一个包含C#实现的Linphone VoIP应用程序的压缩包,主要用于演示如何使用C#进行电话拨打、接听、保持、恢复和转移等操作。这个项目是基于Visual Studio 2017开发的,使用.NET Framework 4.6...