`
kayo
  • 浏览: 557873 次
  • 性别: Icon_minigender_1
  • 来自: 安徽
社区版块
存档分类
最新评论

LDAP 集成应用实例

阅读更多
我们部门有一个系统是专门用来记录大家的请假和加班的.这个系统有一套用户名和密码,我们员工每个人都有一个公司统一分配的ID和密码.大家都觉得既然有统一的ID和密码,为什么还要多记一套登录口令呢?能不能试着把它们的验证系统统一起来,只用Intranet ID 和密码登录就行呢?
        我接到这个任务之后,就开始着手进行调查.首先了解到公司另一个部门有一套系统,能够实现Intranet ID登录.我就和那个系统的负责人联系,几封邮件往来之后,得知他们用的是一种叫到 LDAP 的技术.但他们是用的基于Notes平台的,而我们的系统是基于JSP + Tomcat的,他说他也帮不了太多忙.
        LDAP,一个我从来没有听说过的名词,只好从0开始学习.首先在百度百科里找到了关于它的一个比较详细的解释.通过那篇文章,我对LDAP是什么,能干什么有了比较清晰的了解.接下来就是上网找一些程序,首先找到的是一些如何操作LDAP的程序,但这需要一个管理员帐号和密码.这可把我给难住了,这么大一个公司,员工那么多,我不可能轻易拿到管理员级的帐号.
        我们部门还有另一个项目,他们在维护一个系统,这个系统也能实现Intranet ID 登录.不过他们的系统是用PHP写的,和我要找的东西还是没有太多直接联系.不过我从他们那里拿到了登录的源代码,通过研究源代码,我认识到不需要管理员级的帐号就可以实现用户Intranet ID登录.而且我还从源代码里找到了公司员工信息的LDAP server的URL 和根DN.
       但是当我用这些信息和自己的Intranet ID 和密码登录时,总是不成功,说是密码不对.但是,密码是没有问题的,因为我可以在别的系统里正常登录.我觉得问题还是出在用户名上.我就开始猜用户名到底是什么样的格式? 直接用 "yourname@myourdoain.com" 不行,用 "mail=yourname@myourdoain.com" 也不行.加上根DN, "mail=yourname@myourdoain.com,ou=catalogue,o=test.com", 还是不行. 后来经过不知多少次的尝试,终于发现每个员工都对应一个节点,这个节点有一个名字,你可以用下面的方法得到这个名字,用这个名字再加上根DN就可以了,
SearchResult si = (SearchResult) obj;
userDN = si.getName();
就像这样: "uid=123456,c=cn,ou=catalogue,o=test.com" .
        最后总结出的思路就是先匿名登录LDAP服务器,查询到用户的一些必要信息,组装成登录用的用户ID,然后再用组装好的ID和用户输入的密码重新连接LDAP服务器,成功则表示用户名和密码正确,否则表示用户信息输入错误.
  
    源代码如下,仅供参考:

package com.test.ldap;

import java.util.Hashtable;

import javax.naming.AuthenticationException;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.DirContext;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.Control;
import javax.naming.ldap.InitialLdapContext;
import javax.naming.ldap.LdapContext;



public class UserAuthenticate {
    private String URL = "ldap://localhost:389/";
    private String BASEDN = "ou=catalogue,o=test.com";
    private String FACTORY = "com.sun.jndi.ldap.LdapCtxFactory";
    private LdapContext ctx = null;
    private Hashtable env = null;
    private Control[] connCtls = null;
  
  
    private void LDAP_connect(){
        env = new Hashtable();
        env.put(Context.INITIAL_CONTEXT_FACTORY,FACTORY);
        env.put(Context.PROVIDER_URL, URL+BASEDN);//LDAP server
        env.put(Context.SECURITY_AUTHENTICATION, "simple");
//此处若不指定用户名和密码,则自动转换为匿名登录
      
        try{
            ctx = new InitialLdapContext(env,connCtls);
        }catch(javax.naming.AuthenticationException e){
            System.out.println("Authentication faild: "+e.toString());
        }catch(Exception e){
            System.out.println("Something wrong while authenticating: "+e.toString());
        }
    }
  
  
    private String getUserDN(String email){
        String userDN = "";
      
        LDAP_connect();
      
        try{
               SearchControls constraints = new SearchControls();
               constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
               NamingEnumeration en = ctx.search("", "mail="+email, constraints); //The UID you are going to query,* means all nodes
               if(en == null){
                System.out.println("Have no NamingEnumeration.");
               }
               if(!en.hasMoreElements()){
                System.out.println("Have no element.");
               }
               while (en != null && en.hasMoreElements()){//maybe more than one element
                   Object obj = en.nextElement();
                   if(obj instanceof SearchResult){
                       SearchResult si = (SearchResult) obj;
                       userDN += si.getName();
                       userDN += "," + BASEDN;
                   }
                   else{
                       System.out.println(obj);
                   }
                   System.out.println();
               }
              }catch(Exception e){
               System.out.println("Exception in search():"+e);
              }
      
        return userDN;
    }
  
  
    public boolean authenricate(String ID,String password){
        boolean valide = false;
        String userDN = getUserDN(ID);
      
        try {
            ctx.addToEnvironment(Context.SECURITY_PRINCIPAL,userDN);
            ctx.addToEnvironment(Context.SECURITY_CREDENTIALS,password);
            ctx.reconnect(connCtls);
            System.out.println(userDN + " is authenticated");
            valide = true;
        }catch (AuthenticationException e) {
            System.out.println(userDN + " is not authenticated");
            System.out.println(e.toString());
            valide = false;
        }catch (NamingException e) {
            System.out.println(userDN + " is not authenticated");
            valide = false;
        }
      
        return valide;
    }
}
分享到:
评论
1 楼 a49688448 2011-10-28  
LZ还在IBM工作么

相关推荐

    spring boot集成ldap

    在测试时,你可以创建一个`ldapTest`文件夹,其中包含模拟的测试数据或配置文件,以确保你的LDAP集成工作正常。例如,你可以创建一个`test.ldif`文件,用来导入测试用户数据,然后在测试类中使用`LdapTemplate`进行...

    ldap组件配置案例.doc

    在文档“ldap组件配置案例.doc”中,主要讨论了如何在CAMS系统中集成LDAP组件,以实现与外部应用系统如邮件系统或Windows域的账号共享和统一认证。下面我们将详细探讨这一配置过程及其关键知识点。 1. **功能描述**...

    ldap的一个实例

    - 集成LDAP到企业级应用,如Spring Security框架,实现统一的身份验证和授权。 - 使用LDAP作为服务发现的一部分,存储服务的元数据信息。 通过以上步骤,你可以构建一个基础的LDAP实例,用于身份验证和权限管理。...

    泛微各种集成与及配置等

    10. **案例分析**:实际应用中,泛微可能被集成到如SAP、Oracle、Salesforce等大型企业应用中,实现如订单同步、客户信息共享等具体业务场景。 以上就是关于"泛微各种集成与及配置"的相关知识点,涵盖了集成的多个...

    LDAP实现AD域账号验证 - Java/SpringBoot

    在IT行业中, Lightweight Directory Access Protocol (LDAP) 是一种用于存储和检索目录信息的标准协议,而Active Directory (AD) 是微软提供的目录服务,广泛应用于企业环境中进行用户身份验证和权限管理。...

    java连接LDAP的jar包和实例

    jLDAP库集成了SSL支持,使得开发者能够创建安全的LDAP连接。 下面是一个简单的使用jLDAP进行SSL连接并查询LDAP目录的Java代码示例: ```java import com.novell.ldap.*; public class LDAPSSLExample { public ...

    spring-Ldap

    3. **目录服务集成**: 如果你的应用需要与 LDAP 目录服务进行交互,如读取员工信息、部门结构等,Spring-Ldap 能简化这一过程。 **三、示例中的项目结构** 在提供的压缩包中,`Spring-ldap.jar.zip` 可能包含了 ...

    spring-ldap1.3.1

    此外,还需要配置`LdapContextSource`以创建连接池,以及`LdapTemplate`实例以供应用程序使用。 5. Spring LDAP与Spring Framework集成: Spring LDAP很好地融入了Spring生态,可以与其他Spring模块(如Spring ...

    acegi+ldap

    这个war文件可以被部署到Servlet容器(如Tomcat)中,以运行并展示Acegi和LDAP集成的实例。 "server.xml"是Apache Tomcat或其他Servlet容器的配置文件,可能包含了关于如何配置和连接到LDAP服务器以及设置Acegi安全...

    LDAP原理配置指南

    Fortinet的FortiGate设备支持集成LDAP服务,允许企业利用LDAP进行用户认证和权限管理,提升网络安全性和便捷性。通过配置LDAP,可以实现用户身份验证、授权和审计,进一步加强网络访问控制。 总结,LDAP作为一个...

    LDAP服务器资料,很经典的

    【LDAP服务器介绍】 LDAP(Lightweight Directory Access Protocol)是一种轻量级目录访问协议,它源自上世纪80年代的国际电报...学习和理解LDAP,对于IT管理员和开发者来说,是提升系统管理和集成能力的重要步骤。

    使用Delphi连接LDAP服务器

    在IT领域,特别是软件开发中,`Delphi`是一个强大的集成开发环境(IDE),它基于Object Pascal编程语言。`LDAP`(轻量级目录访问协议)则是一种用于访问和管理分布式目录服务的标准协议,常用于存储和检索用户、组织...

    spring ldap的使用

    Spring LDAP提供了一套强大的工具和API,简化了在Spring应用中集成LDAP的过程。通过使用`LdapTemplate`和`AttributesMapper`等组件,开发人员可以高效地与LDAP服务器交互,执行复杂的数据操作。掌握这些概念和技巧...

    Laravel开发-my-eloquent-ldap

    这个扩展适用于那些既有内部数据库用户,又需要与LDAP/AD服务器集成的Laravel应用,例如企业内部的员工管理系统、多租户平台等。通过这样的扩展,开发者可以轻松地将现有应用与外部身份验证系统整合,同时保持...

    Spring LDAP 简单使用

    它构建在Spring框架之上,提供了一种声明式的方式来处理 LDAP 查询,使得开发者能够更容易地集成LDAP服务到他们的应用中。 **安装与配置** 在开始使用Spring LDAP之前,你需要在项目中添加相关的依赖。如果你使用...

    understanding and deploying ldap directory services,2nd Edtion,pdf

    5. LDAP 集成与应用:探讨如何将 LDAP 与其他系统(如Samba、Active Directory、OpenSSH等)集成,以及如何为各种业务场景设计和实现认证和授权方案。 6. LDAP 性能优化与故障排除:分享如何监控和调整 LDAP 服务...

    Ldap入门文档

    3. **应用集成**:在多个应用程序之间共享信息的情况下,使用LDAP可以简化集成过程并提高效率。 4. **数据分发**:LDAP支持数据的分布存储和复制,这对于大型组织来说非常有用。 #### 五、LDAP与其他数据库的对比 ...

    Java操作ldap(springboot工程)

    在这个项目中,我们将会探讨如何利用SpringBoot框架集成ldap,以及如何进行数据同步。 首先,我们需要了解SpringBoot对LDAP的支持。Spring LDAP是Spring Framework的一部分,它提供了一个高层次的抽象层,使得...

    LDAP Weblogic和AD之间的通信

    在 AD 环境中,WebLogic 通常作为受管服务器运行,通过 LDAP 连接到 AD 实例进行用户身份验证。集成过程可能涉及以下部分: - **配置域安全策略**: 在 AD 域控制器上,为 WebLogic 服务器创建服务账户,并给予相应...

Global site tag (gtag.js) - Google Analytics