LDAP的介绍以及JAVA使用LdapTemplate来进行AD域的操作

发布时间:2023年12月19日

一、概念介绍

1.1 LDAP

LDAP(轻型目录访问协议)是一种用于访问和维护分布式目录服务的开放标准协议。LDAP最初是从X.500标准中派生出来的,但相比于X.500,LDAP更加简化和灵活。LDAP协议定义了客户端和服务器之间进行通信的规范,提供了一种在网络上访问和管理分布式目录数据的方式。
LDAP主要有以下几个概念

  1. 目录服务:目录服务是一种存储和组织数据的系统,类似于数据库,但它更适合于存储和检索大量的层次结构数据。目录服务通常用于存储组织结构信息、用户身份验证和授权等数据。
  2. 目录项:目录项是LDAP中存储的基本单位,每个目录项具有一个唯一的标识符(通常是一个全局唯一的Distinguished Name),并包含一组属性-值对。
  3. Distinguished Name(DN):Distinguished Name是一个目录项的完整路径标识符,由多个RDN(Relative Distinguished Name)组成,每个RDN由属性-值对构成。DN用于在目录中唯一标识一个目录项。
  4. 属性:LDAP目录项可以包含多个属性,每个属性由属性名和对应的值构成。属性名通常是标准化的OID(Object Identifier),比如"cn"表示通用名称、"sn"表示姓氏。
  5. 基准线(Base DN):基准线是LDAP服务器上搜索和操作目录项的起始位置,它指定了在哪个部分的目录层次结构下进行操作。
  6. 绑定(Binding):绑定是指客户端与LDAP服务器建立连接并验证身份的过程,以便进行后续操作。客户端需要提供有效的用户名和密码来进行绑定。
  7. 过滤器(Filter):过滤器用于对目录中的条目进行筛选和搜索,以满足特定的查询条件。常见的过滤器操作符包括等于、大于、小于、与、或、非等。

LDAP在企业环境中广泛应用,特别用于管理用户、组织结构和资源访问控制等信息。通过LDAP,可以实现统一的身份认证和授权管理,提供了集中化的目录服务,方便用户和应用程序访问和检索目录数据。

1.2 AD

1.2.1 AD定义

AD是Active Directory的缩写,AD是LDAP的一个应用实例,而不应该是LDAP本身。比如:windows域控的用户、权限管理应该是微软公司使用LDAP存储了一些数据来解决域控这个具体问题,只是AD顺便还提供了用户接口,也可以利用ActiveDirectory当做LDAP服务器存放一些自己的东西而已。比如LDAP是关系型数据库,微软自己在库中建立了几个表,每个表都定义好了字段。显然这些表和字段都是根据微软自己的需求定制的,而不是LDAP协议的规定。然后微软将LDAP做了一些封装接口,用户可以利用这些接口写程序操作LDAP,使得ActiveDirectory也成了一个LDAP服务器。

1.2.2 特点

  1. 组织架构管理:AD以层次结构的方式组织和管理目录数据。AD中的顶层单位是域(Domain),每个域都可以包含多个组织单位(OU)。这种层次结构可以方便地对资源和用户进行组织、分类和授权。
  2. 用户身份验证和授权:AD用于存储和验证用户的身份信息,并提供了灵活的权限控制机制。通过AD,可以实现对用户访问资源的授权、密码策略的管理以及单点登录等功能。
  3. 安全性和访问控制:AD提供了细粒度的访问控制功能,可以根据用户、组、组织单位等进行权限控制。管理员可以定义不同的安全策略和访问权限,以保护敏感数据和资源。
  4. 集中化管理:AD提供了集中化管理工具,如Active Directory Users and Computers(ADUC),使管理员可以方便地管理用户、组、计算机、策略等。通过这些工具,管理员可以轻松地创建、修改和删除目录对象。
  5. 多域和信任关系:AD支持多域环境,不同的域可以建立信任关系,实现域之间的资源共享和访问。这样,用户可以从一个域访问其他域中的资源,实现跨域认证和授权。
  6. 扩展性和复制:AD具有高度的可扩展性,可以根据需要添加或删除域控制器来适应组织的发展和变化。AD使用复制机制来保持域控制器之间的数据一致性,确保在整个网络中的目录数据是同步的。

总而言之,AD是一种强大的目录服务,广泛用于企业网络环境中,提供统一身份认证、访问控制和资源管理功能,并通过LDAP协议与客户端进行交互。它简化了用户和资源管理的过程,提供了高级的安全性和可扩展性,是企业网络的核心基础设施之一。

1.2.3 应用

  1. 用户服务:管理用户的域账号、用户信息、企业通信录(与电子邮箱系统集成)、用户组管理、用户身份认证、用户授权管理、按需实施组管理策略等。这里不单单指某些线上的应用更多的是指真实的计算机,服务器等
  2. 计算机管理:管理服务器及客户端计算机账户、所有服务器及客户端计算机加入域管理并按需实施组策略。
  3. 资源管理:管理打印机、文件共享服务、网络资源等实施组策略。
  4. 应用系统的支持:对于电子邮件(Exchange)、在线及时通讯(Lync)、企业信息管理(SharePoint)、微软CRM,ERP等业务系统提供数据认证(身份认证、数据集成、组织规则等)。这里不单是微软产品的集成,其它的业务系统根据公用接口的方式一样可以嵌入进来。
  5. 客户端桌面管理:系统管理员可以集中的配置各种桌面配置策略,如:用户适用域中资源权限限制、界面功能的限制、应用程序执行特征的限制、网络连接限制、安全配置限制等。

二、使用

2.1 引入maven依赖

 <dependency>
      <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-data-ldap</artifactId>
   </dependency>

2.2 连接LDAP配置创建LdapTemplate

配置项里面的ldapUrl到password四项配置值可以放在配置文件里面,我写demo代码偷懒一下就先不放进配置文件了

@Configuration
public class LadpConfig {

   //${xxx}代表是变量以你自己实际的为准
    String ldapUrl = "${xxx}";
    String base = "ou=${xxx},${xxx},dc=global";
    String userName = "CN=${xxx},OU=03_Services,OU=CN,OU=${xxx},DC=${xxx},DC=Global";
    String passWord ="${xxx}";

    @Bean
    public LdapContextSource ldapContextSource(){
        LdapContextSource source = new LdapContextSource();
        source.setBase(base);
        source.setUrl(ldapUrl);
        source.setPassword(passWord);
        source.setUserDn(userName);
        return source;
    }

    @Bean
    public LdapTemplate ldapTemplate(){
        return new LdapTemplate(ldapContextSource());
    }

}

2.3 使用LdapTemplate操作AD域

2.3.1 使用之前可以先看下LdapTemplate常使用的api的介绍

  1. search(): 用于执行LDAP搜索操作并返回结果。可以指定搜索的基准DN(Base DN)、过滤器(Filter)、搜索范围(Scope)和要返回的属性列表等
  2. lookup(): 用于执行LDAP查找操作,根据给定的DN获取对应的目录项。它返回一个DirContextOperations对象,可通过该对象访问目录项的属性和值。
  3. bind(): 用于将数据绑定到目录项。可以使用该方法进行目录项的添加、修改和删除操作。可以通过DirContextAdapter对象传递目录项的属性和值
  4. authenticate(): 用于进行用户身份验证。可以指定用户名、密码和绑定DN,LDAPTemplate将检查提供的凭据是否有效。
  5. unbind(): 用于解绑(删除)目录项。可以通过指定要删除的DN来删除整个目录项
  6. rename(): 用于重命名目录项。可以指定要重命名的目录项的原始DN和新的RDN(相对标识符)。
  7. modifyAttributes(): 用于修改目录项的属性值。可以指定要修改的DN和要添加、修改或删除的属性-值对。
  8. executeReadOnly():用于执行只读操作。将具体的LdapOperations执行作为参数传递给此方法,可以在事务内执行操作。
  9. count():用于计算满足给定过滤器条件的目录项数量。
  10. find():用于执行LDAP搜索操作并返回结果。

2.3.2 下面简单演示下常用的用户账户名密码验证以及验证通过后的用户信息查询

  1. 账户名密码校验
@Override
    public boolean ldapAuth(String username, String passWord) {
        EqualsFilter filter = new EqualsFilter("sAMAccountName",username);
        return ldapTemplate.authenticate("",filter.toString(),passWord);
    }
  1. 查询用户信息

//接收用户信息的实体类
@Data
@Entry(base = "dc=b,dc=com", objectClasses = "user")
public class Person {

    @Id
    private Name id;
    @Attribute(name = "cn")
    private String cn;
    @Attribute(name = "sn")
    private String sn;
    @Attribute(name="mail")
    private String mail;
    @Attribute(name="telephoneNumber")
    private String telephoneNumber;
    @Attribute(name="description")
    private String description;
    @Attribute(name="givenName")
    private String givenName;

    @Attribute(name="sAMAccountName")
    private String sAMAccountName;

    @Attribute(name="department")
    private String department;

    @Attribute(name ="mobile")
    private String mobile;

    @Attribute(name = "EmployeeID")
    private String workNo;

    @Attribute(name = "displayName")
    private String userName;
}


//查询用户信息方法
 LdapQuery query = LdapQueryBuilder.query().where("sAMAccountName").is(accountName)
                .and("objectclass").is("user");
        return ldapTemplate.findOne(query, Person.class);
文章来源:https://blog.csdn.net/damokelisijian866/article/details/135072472
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。