LDAP

作者: zdz_peng | 来源:发表于2018-12-29 13:02 被阅读0次

    LDAP

    一、什么是LDAP?

    (一)目录服务

    https://www.cnblogs.com/wilburxu/p/9174353.html

    1. 目录服务是一个特殊的数据库,用来保存描述性的、基于属性的详细信息,支持过滤功能。

    2. 是动态的,灵活的,易扩展的。

    如:人员组织管理,电话簿,地址簿。

    (二)LDAP

    1. LDAP(Light Directory Access Portocol),它是基于X.500标准的轻量级目录访问协议。

    2. 目录是一个为查询、浏览和搜索而优化的数据库,它成树状结构组织数据,类似文件目录一样。

    3. 目录数据库和关系数据库不同,它有优异的读性能,但写性能差,并且没有事务处理、回滚等复杂功能,不适于存储修改频繁的数据。所以目录天生是用来查询的,就好象它的名字一样。

    4. LDAP目录服务是由目录数据库和一套访问协议组成的系统。

    二、LDAP的主要产品

    | 厂商 | 产品 | 介绍 |

    | ---------- | -------------------------- | ------------------------------------------------------------ |

    | SUN | SUNONE Directory Server | 基于文本数据库的存储,速度快 。 |

    | IBM | IBM Directory Server | 基于DB2 的的数据库,速度一般。 |

    | Novell | Novell Directory Server | 基于文本数据库的存储,速度快, 不常用到。 |

    | Microsoft | Microsoft Active Directory | 基于WINDOWS系统用户,对大数据量处理速度一般,但维护容易,生态圈大,管理相对简单。 |

    | Opensource | Opensource | OpenLDAP 开源的项目,速度很快,但是非主 流应用。 |

    三、LDAP的基本概念

    | 关键字 | 英文全称 | 含义 |

    | ---------- | ------------------ | ------------------------------------------------------------ |

    | dc | Domain Component | 域名的部分,其格式是将完整的域名分成几部分,如域名为example.com变成dc=example,dc=com(一条记录的所属位置) |

    | uid | User Id | 用户ID songtao.xu(一条记录的ID) |

    | ou | Organization Unit | 组织单位,组织单位可以包含其他各种对象(包括其他组织单元),如“oa组”(一条记录的所属组织) |

    | cn | Common Name | 公共名称,如“Thomas Johansson”(一条记录的名称) |

    | sn | Surname | 姓,如“许” |

    | dn | Distinguished Name | “uid=songtao.xu,ou=oa组,dc=example,dc=com”,一条记录的位置(唯一) |

    | rdn | Relative dn | 相对辨别名,类似于文件系统中的相对路径,它是与目录树结构无关的部分,如“uid=tom”或“cn= Thomas Johansson” |

    四、java 实现 增删改查

    package com.dist;
    import javax.naming.AuthenticationException;
    import javax.naming.Context;
    import javax.naming.NamingEnumeration;
    import javax.naming.NamingException;
    import javax.naming.directory.BasicAttribute;
    import javax.naming.directory.BasicAttributes;
    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;
    import java.util.Hashtable;
    public class LDAPAuthentication {
        private final static String URL = "ldap://MSI:389/";
        private final static String BASEDN = "dc=dist";  // 根据自己情况进行修改
        private final static String FACTORY = "com.sun.jndi.ldap.LdapCtxFactory";
        private static LdapContext ctx = null;
        private final static Control[] connCtls = null;
        private static void LDAP_connect() {
            Hashtable<String, String> env = new Hashtable<>();
            env.put(Context.INITIAL_CONTEXT_FACTORY, FACTORY);
            env.put(Context.PROVIDER_URL, URL + BASEDN);
            env.put(Context.SECURITY_AUTHENTICATION, "simple");
            String root = "cn=Manager";  //根据自己情况修改
            env.put(Context.SECURITY_PRINCIPAL, root);  // 管理员
            env.put(Context.SECURITY_CREDENTIALS, "abc");  // 管理员密码
            try {
                ctx = new InitialLdapContext(env, connCtls);
                System.out.println( "连接成功" );
            } catch (javax.naming.AuthenticationException e) {
                System.out.println("连接失败:");
                e.printStackTrace();
            } catch (Exception e) {
                System.out.println("连接出错:");
                e.printStackTrace();
            }
        }
        private void closeContext(){
            if (ctx != null) {
                try {
                    ctx.close();
                }
                catch (NamingException e) {
                    e.printStackTrace();
                }
            }
        }
    
        private static String getUserDN(String uid) {
            String userDN = "";
            LDAP_connect();
            try {
                SearchControls constraints = new SearchControls();
                constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
                NamingEnumeration<SearchResult> en = ctx.search("", "uid=" + uid, constraints);
                if (en == null || !en.hasMoreElements()) {
                    System.out.println("未找到该用户");
                }
                // maybe more than one element
                while (en != null && en.hasMoreElements()) {
                    Object obj = en.nextElement();
                    if (obj instanceof SearchResult) {
                        SearchResult si = (SearchResult) obj;
                        userDN += si.getName();
                        userDN += "," + BASEDN;
                        System.out.println(userDN);
                    } else {
                        System.out.println(obj);
                    }
                }
            } catch (Exception e) {
                System.out.println("查找用户时产生异常。");
                e.printStackTrace();
            }
            return userDN;
        }
    
        public boolean authenricate(String UID, String password) {
            boolean valide = false;
            String userDN = getUserDN(UID);
            try {
                ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, userDN);
                ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, password);
                ctx.reconnect(connCtls);
                System.out.println(userDN + " 验证通过");
                valide = true;
            } catch (AuthenticationException e) {
                System.out.println(userDN + " 验证失败");
                System.out.println(e.toString());
                valide = false;
            } catch (NamingException e) {
                System.out.println(userDN + " 验证失败");
                valide = false;
            }
            closeContext();
            return valide;
        }
        private  boolean addUser(String usr, String pwd) {
            try {
                LDAP_connect();
                BasicAttributes attrsbu = new BasicAttributes();
                BasicAttribute objclassSet = new BasicAttribute("objectclass");
                objclassSet.add("inetOrgPerson");
                attrsbu.put(objclassSet);
                attrsbu.put("sn", usr);
                attrsbu.put("cn", usr);
                attrsbu.put("uid", usr);
                attrsbu.put("userPassword", pwd);
                ctx.createSubcontext("uid="+usr, attrsbu);
                return true;
            } catch (NamingException ex) {
                ex.printStackTrace();
            }
            closeContext();
            return false;
        }
    
        public static void main(String[] args) {
            LDAPAuthentication ldap = new LDAPAuthentication();
            ldap.LDAP_connect();
            ldap.getUserDN("admin-c");
            if(ldap.authenricate("admin-s", "pass") == true){
                System.out.println( "该用户认证成功" );
            }
            ldap.addUser("pengtest","123456");
            getUserDN("admin-s");
        }
    }
    
    

    相关文章

      网友评论

          本文标题:LDAP

          本文链接:https://www.haomeiwen.com/subject/hxbulqtx.html