LDAP

2018-12-29  本文已影响0人  zdz_peng

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");
    }
}

上一篇下一篇

猜你喜欢

热点阅读