NeverGO Studio

 

LDAP 导入数据库,解析证书

LDAP 导入数据库,解析证书(2008-08-01 10:52:11)

因业务需要,系统中的用户资料需要从LDAP上提取并存入数据库,LDAP上存放着用户所处的目录结构与证书,证书中含有用户的详细资料,需要进行证书的解析

先将LDAP的结构图附上:

 

本程序是纯JAVA编写,没有任何界面,运行方法是通过BAT文件来运行,也是简单的调用JAVA命令而已。

本程序使用了Spring的IOC依赖注入,来达到程序的灵活配置,让程序无任何硬编码

 代码方面,只贴一些核心方法,其它方法根据各自情况重写即可

首先贴出主方法:

private static String MY_HOST; //LDAP地址
 private static int MY_PORT;    //LDAP商品
 private static String MY_FILTER; //过滤条件
 private static String MY_SEARCHBASE; //查询范围
 private static String CERT_TYPE;  //证书类型
 
省略getter,setter方法
 //参数全部由spring的IOC来进行注入
 //主方法
 public static void main(String[] args){
  BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
  
        //LDAP连接对象
        LDAPConnection ld = null;
        LDAPEntry findEntry = null;
        int status = -1;
        try
        {
            ld = new LDAPConnection();
           
            //连接LDAP
            ld.connect(MY_HOST, MY_PORT);
           
            //在查找结果中要返回的属性列表
            String[] attrs = null;
           
            //返回名字以及找到的属性的值
            boolean attrsonly = false;
           
            //条目查询结果集合
            LDAPSearchResults res = ld.search(MY_SEARCHBASE,
                                              LDAPConnection.SCOPE_SUB,
                                              MY_FILTER,
                                              attrs,
                                              attrsonly);

            //检查数据库是否连接
            if(ConnectionUtil.getConn() == null){
             System.out.println("数据库连接失败,请检查配置文件");
             System.exit(0);
            }
            //循环遍历集合,获取条目
            while (res.hasMoreElements()){
           
                try{               
                    findEntry = res.next();
                }
                catch (LDAPException e){               
                    System.out.println("Error: " + e.toString());
                    continue;
                }

                //属性集
                LDAPAttributeSet findAttrs = findEntry.getAttributeSet();
                Enumeration enumAttrs = findAttrs.getAttributes();
               
                //在属性列表中循环,获取每个属性类型及属性值
                while (enumAttrs.hasMoreElements()){                 
                 
                 //存放证书
                 byte[] uVal = new byte[1024*1000];
                 
                    LDAPAttribute anAttr = (LDAPAttribute) enumAttrs.nextElement();
                    String attrName = anAttr.getName();
                   
                    //过滤证书
                    if(attrName.equals("CertType")){
                     Enumeration certType = anAttr.getStringValues();
                      String val = (String)certType.nextElement();
                      if(val.equals(CERT_TYPE))
                       break;
                     
                    }
                   
                    //获取证书
                   if(attrName.equals("userCertificate")){
                    Enumeration certVals = anAttr.getByteValues();
                 if(certVals != null){
                  while(certVals.hasMoreElements()){
                   uVal = (byte[])certVals.nextElement();
                   //WriteCert.WriteCertByByteArr(sVal,uVal);
                   try {
                    System.out.println("====================");
                    //这里每执行一次WriteCertByByteArr方法,就是处理一个证书信息
                         WriteCert.WriteCertByByteArr(uVal);  


                    System.out.println("====================");
       } catch (Exception e) {
        e.printStackTrace();
        // TODO: handle exception
       }
                  }
                                 
                   }
                }
            }
            status = 0;
        }
        catch (LDAPException e)
        {
            System.out.println("Error: " + e.toString());
        }
        //关闭Connection对象
        try {
         if(!ConnectionUtil.con.isClosed())
             ConnectionUtil.closeCon();
         
  } catch (Exception e) {
   // TODO: handle exception
  }
       
       
        //断开与LDAP服务器的连接
        if ((ld != null) && ld.isConnected())
        {
            try
            {
                ld.disconnect();
            }
            catch (LDAPException e)
            {
                System.out.println("Error: " + e.toString());
            }
        }

        System.exit(status);
    }

WriteCertByByteArr方法:

private static WriteDataBaseByCert wbb;
 //省略getter,setter方法
 public static void WriteCertByByteArr(byte[] cert){
  ByteArrayInputStream fis = null;
  
  try{
   CertificateFactory   certFactory=CertificateFactory.getInstance("X.509");  
   
   //返回字节流
   fis= new ByteArrayInputStream(cert);
   
   //返回证书对象
   X509Certificate  certs =(X509Certificate)certFactory.generateCertificate(fis);
   
   //解析证书内容
   StringBuffer str = WriteCert.analyze(certs.getSubjectDN().getName());
   str = str.deleteCharAt(str.length()-1);
   
   //调用核心方法
   wbb.writes(str.toString().split(","),certs.getNotBefore().toLocaleString(),certs.getNotAfter().toLocaleString());
   
   System.out.println("完成");
   
  }catch(Exception ex){
   ex.printStackTrace();
  }finally{
   try {
    fis.close();
    
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
 }
 analyze方法为解析字符串方法,由证书读取出来的字符串信息来进行拆分,具体实现视字符串格式为准

 

writes方法:

private static String parentId;//用户组首ID
 private static String domainName;//域名称
 

//省略getter,setter方法
 
 
 public String writes(String str[],String startTime,String endTime){
  BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
  
  //DB操作对象
  DBOperate dos = (DBOperate)factory.getBean("dboper");
  
  try {
   String resu = "";
   for (int i = str.length-2; i >2 ; i--) {
    System.out.print(str[i] + " >> ");
    //检查该组是否存在,返回null  or  id
    resu = dos.getExistsByName(str[i]);
    System.out.println(resu);
    
    //如果不存在,执行insert
    if(resu == null){
     parentId = dos.insertResu(str[i], parentId,domainName);
    }else{
     //获得上级ID
     parentId = resu;
    }
    
   }
   
   //写用户表
   boolean flag = dos.getExistsByUserName(str[2]);
   
   //如果不存在用户,则写表
   if(flag){
    dos.insertPerson(str, parentId, startTime, endTime);
   }
  } catch (Exception e) {
   
   e.printStackTrace();
  }
  return null;
 }

关于DB的操作,在这就不贴出代码了,也是简单的JDBC操作,根据自己的业务向库表中写记录就行

posted on 2009-11-25 22:12  梦圆工作组  阅读(1285)  评论(0编辑  收藏  举报

导航