一、何为ldap

LDAP是轻量目录访问协议,英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP。它是基于X.500标准的,但是简单多了并且可以根据需要定制。与X.500不同,LDAP支持TCP/IP,这对访问Internet是必须的。LDAP的核心规范在RFC中都有定义,所有与LDAP相关的RFC都可以在LDAPman RFC网页中找到。基本知识请点击传送门:https://segmentfault.com/a/1190000002607140

二、UnboundID简介

UnboundID LDAP SDK提供了一套快速、强大、用户友好并且开源的Java API来与LDAP目录服务器交互。与其它基于Java的LDAP APIs相比,它具有更好的性能、更易于使用,功能更多。而且还是唯一个不断有活跃开发和增强的SDK。官网地址:https://www.ldap.com/unboundid-ldap-sdk-for-java

三、项目背景

为何选择ldap目录协议?

在企业内部,用户中心是很重要的,但是这个针对客户爸爸的。员工作为企业的支柱,也需要一个好的员工用户中心,来管理员工信息、企业内部系统的账号权限、员工成长以及评估体系。帮助员工提高工作效率,明确自己的不足,达到个人和企业双赢。ldap目录协议适合读的特性对于员工信息有非常好的支持。

四、UnboundID的使用

组织结构:可以看到采用的是ou的tree型结构,uid作为叶子节点附着在各个ou的分支下面。

OU=部门

uid=员工

属性转换:

部门:

ou=部门id(唯一标识)

description=部门名称

员工:

account=账号

cn=姓名

displayName=别名(互联网公司风行的花名)

employeeNumber=工号

mail=公司邮箱

mobile=手机号

sn=姓(默认为空字符串)

title=岗位

userPassword密码

uid=员工id(唯一标识)

1.jar包依赖

使用maven构建的工程:
<dependency>
   <groupId>com.unboundid</groupId>
   <artifactId>unboundid-ldapsdk</artifactId>
   <version>3.2.0</version>
</dependency>
2.连接ldap
LDAPConnection   connection = new LDAPConnection(ldapHost, ldapPort, ldapBindDN, ldapPassword);

3. 查询

基本的查询,可以查询ou和uid等。dn为需要查询的索引语句,filter为查询的条件,相当于sql中的where等,scope为查询的范围。

public static List<SearchResultEntry> queryLdap(String dn, Filter filter, SearchScope scope) {List<SearchResultEntry> result = new ArrayList<SearchResultEntry>();
    try {openConnection();
        SearchRequest searchRequest = new SearchRequest(dn, scope, filter);
        searchRequest.addControl(new SubentriesRequestControl());
        SearchResult searchResult = connection.search(searchRequest);
        for (SearchResultEntry entry : searchResult.getSearchEntries()) {result.add(entry);
        }} catch (Exception e) {LOG.error("query failed.", e);
        throw new BaseRuntimeException(e);
    }return result;
}

4.添加

添加ou或者uid等。dn一样为需要添加到的索引语句,attributes为属性集合(uid的sn属性为必填,但是此处我选择填空字符串)

public static LDAPResult createEntry(String dn, Collection<Attribute> attributes) {LDAPResult result = null;
    try {// 连接LDAP
        openConnection();

        SearchResultEntry entry = connection.getEntry(dn);
        if (entry == null) {// 不存在则创建
            result = connection.add(dn, attributes);
        }} catch (Exception e) {LOG.error("create entry failed", e);
        throw new BaseRuntimeException(e);
    }return result;
}

5.  修改属性

修改ou或者uid的属性,注意,此处不可以直接修改ou和uid(因为这两个属性在dn中,如需修改使用modifyDN)

public static LDAPResult modifyEntry(String dn, Map<String, String> attrs) {LDAPResult result = null;
    if (attrs.size() == 0) {return result;
    }try {// 连接LDAP
        openConnection();

        SearchResultEntry entry = connection.getEntry(dn);
        if (entry == null) {LOG.info("entry is not exist.dn:{}", dn);
            return result;
        }// 修改信息
        ArrayList<Modification> md = new ArrayList<Modification>();
        for (String key : attrs.keySet()) {md.add(new Modification(ModificationType.REPLACE, key, attrs.get(key)));
        }result = connection.modify(dn, md);
    } catch (Exception e) {LOG.error("modify entry failed", e);
        throw new BaseRuntimeException(e);
    }return result;
}

6.  删除

此处删除,我选择直接物理删除,因为数据库中也保存信息,数据库中做标记删除即可。

public static LDAPResult deleteEntry(String dn) {LDAPResult result = null;
    try {// 连接LDAP
        openConnection();

        SearchResultEntry entry = connection.getEntry(dn);

        if (entry == null) {LOG.info("entry is not exist.dn:{}", dn);
            return result;
        }// 物理删除
        result = connection.delete(dn);

    } catch (Exception e) {LOG.error("delete entry failed", e);
        throw new BaseRuntimeException(e);
    }return result;
}

结束语:

ldap作为目录协议,可以良好的集成jenkins、wiki、jira、nas、wifi以及企业内部系统的用户中心。集成时Jenkins等工具时,只需在配置中配置好ldap数据源即可。对于企业内部系统,ldap可以作为单点登录的数据源。后续工具的具体配置以及基于ldap的单点登录方案后续给出。

UnboundID的使用相关推荐

  1. Spring Boot中使用LDAP来统一管理用户信息

    很多时候,我们在构建系统的时候都会自己创建用户管理体系,这对于开发人员来说并不是什么难事,但是当我们需要维护多个不同系统并且相同用户跨系统使用的情况下,如果每个系统维护自己的用户信息,那么此时用户信息 ...

  2. IDEA运行Tomcat8.5.73源码

    一. 下载 8.5.73源码 https://tomcat.apache.org/download-80.cgi 二.解压源码 指定catalina-home 新建catalina-home目录,并将 ...

  3. SpringBoot_配置-@Conditional自动配置报告

    前面我们通过分析HttpEncodingAutoConfiguration,给大家讲解了一下自动配置的原理,那么在自动配置的时候呢,就是这个自动配置要能够生效,他有一些判断,conditional这些 ...

  4. java安全(四) JNDI

    给个关注?宝儿! 给个关注?宝儿! 给个关注?宝儿! 关注公众号:b1gpig信息安全,文章推送不错过 1.JNDI JNDI(Java Naming and Directory Interface) ...

  5. Spring Boot文档阅读比较-@SpringBootApplication Auto Configuration

    maven如下: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="ht ...

  6. android studio连接服务端代码,Android studio - 无法连接到LDAP服务器(示例代码)

    我想在android studio中使用LDAP,我在最新版本中使用UnboundID LDAP SDK for Java. 我使用命令: LDAPConnection ldap = new LDAP ...

  7. java连接ldap服务器_java – LDAP:如何使用连接详细信息验证用...

    我无法使用LDAP对用户进行身份验证.我有以下细节: URL=ldap://10.10.10.10:389 LDAP BASE:DC=lab2,DC=ins LDAP Bind Account: CN ...

  8. JNDI-Injection-With-LDAP-Unserialize

    前言 前段时间FastJson的利用,最后使用了JNDI注入的方式 使得利用条件变得简单. 从一开始的RMI到LDAP, 都是把一个Reference对象绑定到N/D服务上, 最终实例化CodeBas ...

  9. Javaweb安全——Fastjson反序列化利用

    Fastjson前置知识 反序列化函数 Object obj = JSON.parse(); //解析为JSONObject类型或者JSONArray类型 Object obj = JSON.pars ...

最新文章

  1. 深度丨11位科技大牛谈人工智能:AI如何改变游戏规则
  2. BCH钱包的“现金”支持比特币现金NFC交易
  3. 对于150kHz导航信号放大检波天线保护电路
  4. 【OpenCV3】cv::Mat的定义与初始化
  5. MVC layout 命名空间引用问题
  6. 自动判断浏览器的中英文版本自动跳转网站中英文页面代码
  7. java map 不存在的key_java – HashMap表示即使它确实存在,Key也不存在
  8. 前端学习(639):undefine和null
  9. anaconda+cuda+cudnn+pytorch安装踩坑大全
  10. Esfog_UnityShader教程_NormalMap法线贴图
  11. 超详细!使用 LVS 实现负载均衡原理及安装配置详解
  12. 浅析单调递增子序列问题(LIS)
  13. 远程服务器如何共享电脑文件共享,远程控制实现文件共享 -电脑资料
  14. Git简介之部分易混淆命令的简单介绍
  15. Golang将IP转为整型int存储
  16. 2021年全面攻读人物传记【书单】(持续更新)
  17. linux删除的快捷键
  18. 解决MATLAB绘图延迟问题的一种方法
  19. bert 中文 代码 谷歌_从字到词,大词典中文BERT模型的探索之旅
  20. Matrix Theory(矩阵理论)

热门文章

  1. Android:TextView和EditText
  2. algorithm介绍
  3. 转自Avan_Lau
  4. 【多尺度密集递归融合网络:超分】
  5. 对“动态多重网络”建模与目标选择方法的介绍
  6. 苹果或将微信下架系谣言,苹果微信牵手ios11
  7. CodePush热更新常用命令与注意事项
  8. 字典生成----在线密码破解工具hydra和medusa的使用
  9. PHP面向对象基础七
  10. win7电脑怎么提升开机速度?