共计 4667 个字符,预计需要花费 12 分钟才能阅读完成。
很多时候,咱们在做公司零碎或产品时,都须要本人创立用户管理体系,这对于开发人员来说并不是什么难事,然而当咱们须要保护多个不同零碎并且雷同用户跨零碎应用的状况下,如果每个系统维护本人的用户信息,那么此时用户信息的同步就会变的比拟麻烦,对于用户本身来说也会十分困扰,很容易呈现不同零碎明码不统一啊等状况呈现。
如果此时咱们引入 LDAP 来集中存储用户的根本信息并提供对立的读写接口和校验机制,那么这样的问题就比拟容易解决了。尤其在一些外部管理系统的开发和搭建时,往往咱们的外部零碎一开始并不全是本人开发的,还有很多第三方产品反对,比方:OA 零碎、财务零碎等,如果本人开发一套用户管理系统,那么这些零碎对接还得二次开发,老本很大。因为 LDAP 并不是什么新技术,大部分成熟软件都反对用 LDAP 来治理用户,所以时至今日,LDAP 的利用仍然能够常常看到。
上面咱们就具体来看看,当应用 Spring Boot 开发的时候,如何来拜访 LDAP 服务端。
LDAP 简介
LDAP(轻量级目录拜访协定,Lightweight Directory Access Protocol)是实现提供被称为目录服务的信息服务。目录服务是一种非凡的数据库系统,其专门针对读取,浏览和搜寻操作进行了特定的优化。目录个别用来蕴含描述性的,基于属性的信息并反对精密简单的过滤能力。目录个别不反对通用数据库针对大量更新操作操作须要的简单的事务管理或回卷策略。而目录服务的更新则个别都非常简单。这种目录能够存储包含个人信息、web 链结、jpeg 图像等各种信息。为了拜访存储在目录中的信息,就须要应用运行在 TCP/IP 之上的拜访协定—LDAP。
LDAP 目录中的信息是是依照树型构造组织,具体信息存储在条目 (entry) 的数据结构中。条目相当于关系数据库中表的记录;条目是具备区别名 DN(Distinguished Name)的属性(Attribute),DN 是用来援用条目标,DN 相当于关系数据库表中的关键字(Primary Key)。属性由类型(Type)和一个或多个值(Values)组成,相当于关系数据库中的字段(Field)由字段名和数据类型组成,只是为了不便检索的须要,LDAP 中的 Type 能够有多个 Value,而不是关系数据库中为升高数据的冗余性要求实现的各个域必须是不相干的。LDAP 中条目标组织个别依照地理位置和组织关系进行组织,十分的直观。LDAP 把数据寄存在文件中,为提高效率能够应用基于索引的文件数据库,而不是关系数据库。类型的一个例子就是 mail,其值将是一个电子邮件地址。
LDAP 的信息是以树型构造存储的,在树根个别定义国家 (c=CN) 或域名 (dc=com),在其下则往往定义一个或多个组织 (organization)(o=Acme) 或组织单元 (organizational units) (ou=People)。一个组织单元可能蕴含诸如所有雇员、大楼内的所有打印机等信息。此外,LDAP 反对对条目可能和必须反对哪些属性进行管制,这是有一个非凡的称为对象类别(objectClass) 的属性来实现的。该属性的值决定了该条目必须遵循的一些规定,其规定了该条目可能及至多应该蕴含哪些属性。例如:inetorgPerson 对象类须要反对 sn(surname)和 cn(common name)属性,但也能够蕴含可选的如邮件,电话号码等属性。
LDAP 简称对应
- o:organization(组织 - 公司)
- ou:organization unit(组织单元 - 部门)
- c:countryName(国家)
- dc:domainComponent(域名)
- sn:surname(姓氏)
- cn:common name(罕用名称)
以上内容参考自:LDAP 疾速入门
入门示例
在理解了 LDAP 的根底概念之后,咱们通过一个简略例子进一步了解!
- 创立一个根底的 Spring Boot 我的项目(如果您还不会,能够参考这篇文章:疾速入门 1)
- 在
pom.xml
中引入两个重要依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-ldap</artifactId>
</dependency>
<dependency>
<groupId>com.unboundid</groupId>
<artifactId>unboundid-ldapsdk</artifactId>
<scope>test</scope>
</dependency>
其中,spring-boot-starter-data-ldap
是 Spring Boot 封装的对 LDAP 自动化配置的实现,它是基于 spring-data-ldap 来对 LDAP 服务端进行具体操作的。
而 unboundid-ldapsdk
次要是为了在这里应用嵌入式的 LDAP 服务端来进行测试操作,所以 scope
设置为了 test,理论利用中,咱们通常会连贯实在的、独立部署的 LDAP 服务器,所以不须要此项依赖。
- 在
src/test/resources
目录下创立ldap-server.ldif
文件,用来存储 LDAP 服务端的根底数据,以备前面的程序拜访之用。
dn: dc=didispace,dc=com
objectClass: top
objectClass: domain
objectclass: extensibleObject
dc: didispace
dn: ou=people,dc=didispace,dc=com
objectclass: top
objectclass: organizationalUnit
ou: people
dn: uid=ben,ou=people,dc=didispace,dc=com
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: didi
sn: zhaiyongchao
uid: didi
userPassword: {SHA}nFCebWjxfaLbHHG1Qk5UU4trbvQ=
这里创立了一个根底用户,实在姓名为zhaiyongchao
,罕用名didi
,在前面的程序中,咱们会来读取这些信息。更多内容解释大家能够深刻学习 LDAP 来了解,这里不做过多的解说。
- 在
application.properties
中增加嵌入式 LDAP 的配置
spring.ldap.embedded.ldif=classpath:ldap-server.ldif
spring.ldap.embedded.base-dn=dc=didispace,dc=com
- 应用 spring-data-ldap 的根底用法,定义 LDAP 中属性与咱们 Java 中定义实体的关系映射以及对应的 Repository
@Data
@Entry(base = "ou=people,dc=didispace,dc=com", objectClasses = "inetOrgPerson")
public class Person {
@Id
private Name id;
@DnAttribute(value = "uid", index = 3)
private String uid;
@Attribute(name = "cn")
private String commonName;
@Attribute(name = "sn")
private String userName;
private String userPassword;
}
public interface PersonRepository extends CrudRepository<Person, Name> {}
通过下面的定义之后,曾经将 Person 对象与 LDAP 存储内容实现了映射,咱们只须要应用 PersonRepository
就能够轻松的对 LDAP 内容实现读写。
- 创立单元测试用例读取所有用户信息:
@Slf4j
@SpringBootTest
public class ApplicationTests {
@Autowired
private PersonRepository personRepository;
@Test
public void findAll() {personRepository.findAll().forEach(p -> {System.out.println(p);
});
}
}
启动该测试用例之后,咱们能够看到控制台中输入了方才保护在 ldap-server.ldif
中的用户信息:
Person(id=uid=ben,ou=people,dc=didispace,dc=com, uid=ben, commonName=didi, userName=zhaiyongchao, userPassword=123,83,72,65,125,110,70,67,101,98,87,106,120,102,97,76,98,72,72,71,49,81,107,53,85,85,52,116,114,98,118,81,61)
增加用户
通过下面的入门示例,如果您可能独立实现,那么在 Spring Boot 中操作 LDAP 的根底指标曾经实现了。
如果您足够理解 Spring Data,其实不难想到,这个在其下的子项目必然也恪守 Repsitory 的形象。所以,咱们能够应用下面定义的 PersonRepository
来轻松实现操作,比方上面的代码就能够不便的往 LDAP 中增加用户:
Person person = new Person();
person.setUid("uid:1");
person.setSuerName("AAA");
person.setCommonName("aaa");
person.setUserPassword("123456");
personRepository.save(person);
如果还想实现更多操作,您能够参考 spring-data-ldap 的文档来进行应用。
连贯 LDAP 服务端
在本文的例子中都采纳了嵌入式的 LDAP 服务器,事实上这种形式也仅限于咱们本地测试开发应用,实在环境下 LDAP 服务端必然是独立部署的。
在 Spring Boot 的封装下,咱们只须要配置上面这些参数就能将下面的例子连贯到远端的 LDAP 而不是嵌入式的 LDAP。
spring.ldap.urls=ldap://localhost:1235
spring.ldap.base=dc=didispace,dc=com
spring.ldap.username=didispace
spring.ldap.password=123456
关注我,前面更新如何与 Spring Security 联合应用!
本系列教程《Spring Boot 2.x 基础教程》点击中转!。学习过程中如遇艰难,倡议退出 Spring 技术交换群,参加交换与探讨,更好的学习与提高!
代码示例
本文的相干例子能够查看上面仓库中的 chapter2-8
目录:
- Github:https://github.com/dyc87112/SpringBoot-Learning/
- Gitee:https://gitee.com/didispace/SpringBoot-Learning/
如果您感觉本文不错,欢送 Star
反对,您的关注是我保持的能源!
欢送关注我的公众号:程序猿 DD,分享其余中央看不到的常识与思考