LDAP(轻型目录访问协议)是一种用于访问和维护分布式目录服务的开放标准协议。LDAP最初是从X.500标准中派生出来的,但相比于X.500,LDAP更加简化和灵活。LDAP协议定义了客户端和服务器之间进行通信的规范,提供了一种在网络上访问和管理分布式目录数据的方式。
LDAP主要有以下几个概念
LDAP在企业环境中广泛应用,特别用于管理用户、组织结构和资源访问控制等信息。通过LDAP,可以实现统一的身份认证和授权管理,提供了集中化的目录服务,方便用户和应用程序访问和检索目录数据。
1.2.1 AD定义
AD是Active Directory的缩写,AD是LDAP的一个应用实例,而不应该是LDAP本身。比如:windows域控的用户、权限管理应该是微软公司使用LDAP存储了一些数据来解决域控这个具体问题,只是AD顺便还提供了用户接口,也可以利用ActiveDirectory当做LDAP服务器存放一些自己的东西而已。比如LDAP是关系型数据库,微软自己在库中建立了几个表,每个表都定义好了字段。显然这些表和字段都是根据微软自己的需求定制的,而不是LDAP协议的规定。然后微软将LDAP做了一些封装接口,用户可以利用这些接口写程序操作LDAP,使得ActiveDirectory也成了一个LDAP服务器。
1.2.2 特点
总而言之,AD是一种强大的目录服务,广泛用于企业网络环境中,提供统一身份认证、访问控制和资源管理功能,并通过LDAP协议与客户端进行交互。它简化了用户和资源管理的过程,提供了高级的安全性和可扩展性,是企业网络的核心基础设施之一。
1.2.3 应用
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-ldap</artifactId>
</dependency>
配置项里面的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.1 使用之前可以先看下LdapTemplate常使用的api的介绍
2.3.2 下面简单演示下常用的用户账户名密码验证以及验证通过后的用户信息查询
@Override
public boolean ldapAuth(String username, String passWord) {
EqualsFilter filter = new EqualsFilter("sAMAccountName",username);
return ldapTemplate.authenticate("",filter.toString(),passWord);
}
//接收用户信息的实体类
@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);