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

LDAP代码操作Demo

阅读更多
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代码操作Demo,LDAP操作代码样例 初始化LDAP 目录服务上下文、绑定/创建LDAP条目对象、获取条目属性、修改条目属性等实例

    spring-ldap demo

    本示例项目 "spring-ldap demo" 提供了一个关于如何使用 Spring LDAP 进行实际操作的详细教程,包括与 LDAP 目录的增删查改操作,并结合了 EXT.js 进行前端展示。 首先,我们来了解一下 Spring LDAP 的核心概念。...

    ldap_SpringBoot.zip

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

    openapi-demo-php-master_openapi_DEMO_

    5. **PHP LDAP库**:在PHP中,可以使用`ldap_*`函数系列与LDAP服务器进行交互,例如`ldap_connect`建立连接,`ldap_bind`进行身份验证,`ldap_search`查询目录,以及`ldap_mod_add`、`ldap_mod_replace`等操作数据。...

    shiro-demo_DEMO_shiro_shriodemo_shiro框架demo_shiro前后端分离_

    开发者可以通过下载 "shiro-demo" 文件,导入到 IDE 中运行,查看其如何处理登录、权限检查等操作。通过阅读代码,可以了解 Shiro 如何与后端控制器、数据库及前端交互,从而在自己的项目中应用类似的安全机制。 ...

    ldap轻量级目录协议

    **LDAP:轻量级目录访问协议** LDAP(Lightweight Directory Access...通过这个小demo,你可以深入理解LDAP的基本操作和在实际项目中的应用。在学习过程中,建议结合具体的代码和文档来实践,以更好地掌握LDAP的使用。

    SpringLDAP和JNDI的增删改查

    提供的压缩包`SpringLDAPClient`是一个基于Eclipse的项目,包含示例代码来演示上述操作。导入该项目后,你可以编译并运行,观察Spring LDAP和JNDI如何实现对LDAP目录的CRUD操作。 ### 结语 理解并熟练使用Spring ...

    delphi for adsi demo 代码

    在"delphi for adsi demo 代码"中,我们可以探索以下几个关键知识点: 1. **ADSI对象模型**:ADSI定义了一种统一的对象模型,使得开发者可以通过统一的接口与不同的目录服务进行交互。这些对象包括用户、计算机、组...

    cas4.1.x 集成 mysql,ldap,redis(session和票据),写了简单的两个客户端 demo.zip

    CAS(Central Authentication Service)是一种广泛使用的开放源代码的单点登录(Single Sign-On,SSO)系统,主要用于网络应用的集中身份验证。在本项目中,我们关注的是CAS 4.1.x版本,它集成了MySQL数据库、LDAP...

    修改ad域密码及新增账号demo.zip

    在这个"修改AD域密码及新增账号demo.zip"压缩包中,我们看到的是一个基于Java操作LDAP(轻量级目录访问协议)来与AD域进行交互的示例代码,目的是为了演示如何修改AD用户的密码以及如何新增AD账号。 首先,理解Java...

    JNDIDemo 以及相关文档

    9. **JNDIDemo**:提供的`JNDIDemo`可能是一个示例程序,展示了如何使用JNDI进行查找、绑定等操作。通过查看源代码和运行示例,可以深入理解JNDI的工作原理。 10. **学习资料**:提供的文档,如`java的JNDI 技术...

    spring boot集成demo大全.zip

    ElasticSearch(`基本操作和高级查询`)、Async(`异步任务`)、集成Dubbo(`采用官方的starter`)、MongoDB(`文档数据库`)、neo4j(`图数据库`)、docker(`容器化`)、`JPA多数据源`、`Mybatis多数据源`、`代码生成器`、Gray...

    Java JAAS安全认证 demo

    通常,这涉及到检查`Subject`中的权限或角色,以确定用户是否被允许执行特定操作。 `JaasDemo`可能是该示例项目的主要类,它演示了上述流程。在这个例子中,可能包含以下关键部分: - 一个自定义的登录模块实现,...

    shiro基础搭建demo代码:shiro.rar

    - **Realms** - 实现了特定数据源的认证和授权逻辑,比如从数据库或LDAP获取用户信息。你需要创建一个自定义的Realm,并配置对应的认证和授权算法。 - **Session Management** - Shiro提供了会话管理,可以在不依赖...

    Shiro全Demo

    Realms是Shiro与应用特定安全数据源(如数据库、LDAP等)的桥梁,负责从数据源获取身份验证和授权信息。Cryptography组件则提供加密服务,确保敏感信息的安全存储和传输。Session管理则是Shiro处理会话数据的方式,...

    shiro第六章Realm完整Demo

    - 安全API:Shiro 提供了一系列的静态工具类,方便在代码中进行安全相关的操作。 通过这个完整的 Realm Demo,你可以学习到如何将Shiro与实际应用相结合,实现一套完整的用户认证和授权系统。这不仅有助于理解...

    spring-boot-demo_xkcoding.tar.gz

    ElasticSearch(基本操作和高级查询)、Async(异步任务)、集成Dubbo(采用官方的starter)、MongoDB(文档数据库)、neo4j(图数据库)、docker(容器化)、JPA多数据源、Mybatis多数据源、代码生成器、GrayLog(日志收集)、...

    SpringSecurity Demo

    开发者可以自定义认证提供者,以适应特定的应用场景,比如与LDAP服务器或自定义数据库进行交互进行身份验证。 **2. 授权(Authorization)** 授权是决定一个经过认证的用户是否有权限执行某个操作的过程。Spring ...

    shiro登录拦截校验demo

    在"pcMsg"这个文件中,可能包含了项目的源代码、配置文件等,通过查看这些文件,我们可以深入理解Shiro如何在实际项目中被运用,包括登录验证的具体实现、权限拦截的逻辑以及如何配置和扩展Shiro。通过这个demo,...

    linphoneC#demo.7z

    【linphoneC#demo.7z】是一个包含C#实现的Linphone VoIP应用程序的压缩包,主要用于演示如何使用C#进行电话拨打、接听、保持、恢复和转移等操作。这个项目是基于Visual Studio 2017开发的,使用.NET Framework 4.6...

Global site tag (gtag.js) - Google Analytics