LDAP是轻量目录访问协议(Lightweight Directory Access Protocol)的缩写,LDAP标准实际上是在X.500标准基础上产生的一个简化版本

AD是Active  Directory的缩写,AD应该是LDAP的一个应用实例,而不应该是LDAP本身。比如:windows域控的用户、权限管理应该是微软公司使用LDAP存储了一些数据来解决域控这个具体问题,

只是AD顺便还提供了用户接口,也可以利用Active Directory当做LDAP服务器存放一些自己的东西而已。比如LDAP是关系型数据库,微软自己在库中建立了几个表,每个表都定义好了字段。显然这些表和字段都是根据微软自己的需求定制的,而不是LDAP协议的规定。然后微软将LDAP做了一些封装接口,用户可以利用这些接口写程序操作LDAP,使得Active Directory也成了一个LDAP服务器。

总之:Active Directory = LDAP服务器+LDAP应用(Windows域控)。Active Directory先实现一个LDAP服务器,然后自己先用这个LDAP服务器实现了自己的一个具体应用(域控)

厂商

产品

介绍

SUN

SUNONE Directory Server

基于文本数据库的存储,速度快 。

IBM

IBM Directory Server

基于DB2 的的数据库,速度一般。

Novell

Novell Directory Server

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

Microsoft 

Microsoft Active Directory

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

Opensource

Opensource

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

Openldap 整合windows AD认证

Openldap是开源的目录服务实现,windows AD是微软的目录服务现实。现状是有的场景(应用、客户端)跟openldap结合比较容易,有的场景又是必须要用AD,所以几乎不可能弃用其中的任意一种。但同时维护两套系统意味着维护工作大量增加(不仅仅只是增加一倍,要考虑信息分别维护、同步etc等)、出错几率增加。

其中的一种较成熟、使用比较多的解决方案是:openldap使用windows AD的认证,这样只需要在AD上维护一套用户密码即可。

流程图

AD和LDAP的区别_AD和LDAP

如图,相关组件分四大部分:

1.LDAP client ;这个是实际调用ldap服务的系统,也可以是类似ldapsearch之类的client 程序

2.Openldap;开源服务端,实际进程为slapd

3.Saslauthd;简单认证服务层的守护进程,该进程要安装在openldap服务器上
4.Active directory;即windows AD

Spring Security LDAP简介

Maven Dependency

首先,让我们看看我们需要的maven依赖项:

  •  
<dependency>    <groupId>org.springframework.security</groupId>    <artifactId>spring-security-ldap</artifactId></dependency><dependency>    <groupId>org.apache.directory.server</groupId>    <artifactId>apacheds-server-jndi</artifactId>    <version>1.5.5</version></dependency>

Java Configuration

接下来,我们来讨论我们的Spring Security Java配置:

  •  
public class SecurityConfig extends WebSecurityConfigurerAdapter {    @Override    protected void configure(AuthenticationManagerBuilder auth) throws Exception {        auth.ldapAuthentication()            .userSearchBase("ou=people")            .userSearchFilter("(uid={0})")            .groupSearchBase("ou=groups")            .groupSearchFilter("member={0}")            .contextSource()            .root("dc=baeldung,dc=com")            .ldif("classpath:users.ldif");    }}

需要注意的是userSearchFilter("(uid={0})")对应的uid每个ldap产品不一样,微软adldap对应的是SamAccountName={0}。

XML Configuration

现在,我们来看看相应的XML配置:

  •  
<authentication-manager>    <ldap-authentication-provider      user-search-base="ou=people"      user-search-filter="(uid={0})"      group-search-base="ou=groups"      group-search-filter="(member={0})">    </ldap-authentication-provider></authentication-manager>   <ldap-server root="dc=baeldung,dc=com" ldif="users.ldif"/>

LDAP数据交换格式

LDAP数据可以使用LDAP数据交换格式(LDIF)表示 - 这是我们的用户数据的示例:

  •  
dn: ou=groups,dc=baeldung,dc=comobjectclass: topobjectclass: organizationalUnitou: groups dn: ou=people,dc=baeldung,dc=comobjectclass: topobjectclass: organizationalUnitou: people dn: uid=baeldung,ou=people,dc=baeldung,dc=comobjectclass: topobjectclass: personobjectclass: organizationalPersonobjectclass: inetOrgPersoncn: Jim Beamsn: Beamuid: baeldunguserPassword: password dn: cn=admin,ou=groups,dc=baeldung,dc=comobjectclass: topobjectclass: groupOfNamescn: adminmember: uid=baeldung,ou=people,dc=baeldung,dc=com dn: cn=user,ou=groups,dc=baeldung,dc=comobjectclass: topobjectclass: groupOfNamescn: usermember: uid=baeldung,ou=people,dc=baeldung,dc=com