You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

README.md 8.3 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393
  1. # spring-boot-demo-ldap
  2. > 此 demo 主要演示了 Spring Boot 如何集成 `spring-boot-starter-data-ldap` 完成对 LDAP 的基本 CURD操作, 并给出以登录为实战的 API 示例
  3. ## docker openldap 安装步骤
  4. > 参考: https://github.com/osixia/docker-openldap
  5. 1. 下载镜像: `docker pull osixia/openldap:1.2.5`
  6. 2. 运行容器: `docker run -p 389:389 -p 636:636 --name my-openldap --detach osixia/openldap:1.2.5`
  7. 3. 添加管理员: `docker exec my-openldap ldapsearch -x -H ldap://localhost -b dc=example,dc=org -D "cn=admin,dc=example,dc=org" -w admin`
  8. 4. 停止容器:`docker stop my-openldap`
  9. 5. 启动容器:`docker start my-openldap`
  10. ## pom.xml
  11. ```xml
  12. <?xml version="1.0" encoding="UTF-8"?>
  13. <project xmlns="http://maven.apache.org/POM/4.0.0"
  14. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  15. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  16. <modelVersion>4.0.0</modelVersion>
  17. <artifactId>spring-boot-demo-ldap</artifactId>
  18. <version>1.0.0-SNAPSHOT</version>
  19. <packaging>jar</packaging>
  20. <name>spring-boot-demo-ldap</name>
  21. <description>Demo project for Spring Boot</description>
  22. <parent>
  23. <artifactId>spring-boot-demo</artifactId>
  24. <groupId>com.xkcoding</groupId>
  25. <version>1.0.0-SNAPSHOT</version>
  26. </parent>
  27. <properties>
  28. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  29. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  30. <java.version>1.8</java.version>
  31. </properties>
  32. <dependencies>
  33. <dependency>
  34. <groupId>org.springframework.boot</groupId>
  35. <artifactId>spring-boot-starter-data-ldap</artifactId>
  36. </dependency>
  37. <!-- test -->
  38. <dependency>
  39. <groupId>org.springframework.boot</groupId>
  40. <artifactId>spring-boot-starter-test</artifactId>
  41. <scope>test</scope>
  42. </dependency>
  43. <!-- lombok -->
  44. <dependency>
  45. <groupId>org.projectlombok</groupId>
  46. <artifactId>lombok</artifactId>
  47. <optional>true</optional>
  48. <scope>provided</scope>
  49. </dependency>
  50. </dependencies>
  51. </project>
  52. ```
  53. ## application.yml
  54. ```yaml
  55. spring:
  56. ldap:
  57. urls: ldap://localhost:389
  58. base: dc=example,dc=org
  59. username: cn=admin,dc=example,dc=org
  60. password: admin
  61. ```
  62. ## Person.java
  63. > 实体类
  64. > @Entry 注解 映射ldap对象关系
  65. ```java
  66. /**
  67. * People
  68. *
  69. * @author fxbin
  70. * @version v1.0
  71. * @since 2019-08-26 0:51
  72. */
  73. @Data
  74. @Entry(
  75. base = "ou=people",
  76. objectClasses = {"posixAccount", "inetOrgPerson", "top"}
  77. )
  78. public class Person implements Serializable {
  79. private static final long serialVersionUID = -7946768337975852352L;
  80. @Id
  81. private Name id;
  82. private String uidNumber;
  83. private String gidNumber;
  84. /**
  85. * 用户名
  86. */
  87. @DnAttribute(value = "uid", index = 1)
  88. private String uid;
  89. /**
  90. * 姓名
  91. */
  92. @Attribute(name = "cn")
  93. private String personName;
  94. /**
  95. * 密码
  96. */
  97. private String userPassword;
  98. /**
  99. * 名字
  100. */
  101. private String givenName;
  102. /**
  103. * 姓氏
  104. */
  105. @Attribute(name = "sn")
  106. private String surname;
  107. /**
  108. * 邮箱
  109. */
  110. private String mail;
  111. /**
  112. * 职位
  113. */
  114. private String title;
  115. /**
  116. * 根目录
  117. */
  118. private String homeDirectory;
  119. /**
  120. * loginShell
  121. */
  122. private String loginShell;
  123. }
  124. ```
  125. ## PersonRepository.java
  126. > person 数据持久层
  127. ```java
  128. /**
  129. * PersonRepository
  130. *
  131. * @author fxbin
  132. * @version v1.0
  133. * @since 2019-08-26 1:02
  134. */
  135. @Repository
  136. public interface PersonRepository extends CrudRepository<Person, Name> {
  137. /**
  138. * 根据用户名查找
  139. *
  140. * @param uid 用户名
  141. * @return com.xkcoding.ldap.entity.Person
  142. */
  143. Person findByUid(String uid);
  144. }
  145. ```
  146. ## PersonService.java
  147. > 数据操作服务
  148. ```java
  149. /**
  150. * PersonService
  151. *
  152. * @author fxbin
  153. * @version v1.0
  154. * @since 2019-08-26 1:05
  155. */
  156. public interface PersonService {
  157. /**
  158. * 登录
  159. *
  160. * @param request {@link LoginRequest}
  161. * @return {@link Result}
  162. */
  163. Result login(LoginRequest request);
  164. /**
  165. * 查询全部
  166. *
  167. * @return {@link Result}
  168. */
  169. Result listAllPerson();
  170. /**
  171. * 保存
  172. *
  173. * @param person {@link Person}
  174. */
  175. void save(Person person);
  176. /**
  177. * 删除
  178. *
  179. * @param person {@link Person}
  180. */
  181. void delete(Person person);
  182. }
  183. ```
  184. ## PersonServiceImpl.java
  185. > person数据操作服务具体逻辑实现类
  186. ```java
  187. /**
  188. * PersonServiceImpl
  189. *
  190. * @author fxbin
  191. * @version v1.0
  192. * @since 2019-08-26 1:05
  193. */
  194. @Slf4j
  195. @Service
  196. @RequiredArgsConstructor(onConstructor_ = @Autowired)
  197. public class PersonServiceImpl implements PersonService {
  198. private final PersonRepository personRepository;
  199. /**
  200. * 登录
  201. *
  202. * @param request {@link LoginRequest}
  203. * @return {@link Result}
  204. */
  205. @Override
  206. public Result login(LoginRequest request) {
  207. log.info("IN LDAP auth");
  208. Person user = personRepository.findByUid(request.getUsername());
  209. try {
  210. if (ObjectUtils.isEmpty(user)) {
  211. throw new ServiceException("用户名或密码错误,请重新尝试");
  212. } else {
  213. user.setUserPassword(LdapUtils.asciiToString(user.getUserPassword()));
  214. if (!LdapUtils.verify(user.getUserPassword(), request.getPassword())) {
  215. throw new ServiceException("用户名或密码错误,请重新尝试");
  216. }
  217. }
  218. } catch (NoSuchAlgorithmException e) {
  219. e.printStackTrace();
  220. }
  221. log.info("user info:{}", user);
  222. return Result.success(user);
  223. }
  224. /**
  225. * 查询全部
  226. *
  227. * @return {@link Result}
  228. */
  229. @Override
  230. public Result listAllPerson() {
  231. Iterable<Person> personList = personRepository.findAll();
  232. personList.forEach(person -> person.setUserPassword(LdapUtils.asciiToString(person.getUserPassword())));
  233. return Result.success(personList);
  234. }
  235. /**
  236. * 保存
  237. *
  238. * @param person {@link Person}
  239. */
  240. @Override
  241. public void save(Person person) {
  242. Person p = personRepository.save(person);
  243. log.info("用户{}保存成功", p.getUid());
  244. }
  245. /**
  246. * 删除
  247. *
  248. * @param person {@link Person}
  249. */
  250. @Override
  251. public void delete(Person person) {
  252. personRepository.delete(person);
  253. log.info("删除用户{}成功", person.getUid());
  254. }
  255. }
  256. ```
  257. ## LdapDemoApplicationTests.java
  258. > 测试
  259. ```java
  260. /**
  261. * LdapDemoApplicationTest
  262. *
  263. * @author fxbin
  264. * @version v1.0
  265. * @since 2019-08-26 1:06
  266. */
  267. @RunWith(SpringRunner.class)
  268. @SpringBootTest
  269. public class LdapDemoApplicationTests {
  270. @Resource
  271. private PersonService personService;
  272. @Test
  273. public void contextLoads() {
  274. }
  275. /**
  276. * 测试查询单个
  277. */
  278. @Test
  279. public void loginTest() {
  280. LoginRequest loginRequest = LoginRequest.builder().username("wangwu").password("123456").build();
  281. Result login = personService.login(loginRequest);
  282. System.out.println(login);
  283. }
  284. /**
  285. * 测试查询列表
  286. */
  287. @Test
  288. public void listAllPersonTest() {
  289. Result result = personService.listAllPerson();
  290. System.out.println(result);
  291. }
  292. /**
  293. * 测试保存
  294. */
  295. @Test
  296. public void saveTest() {
  297. Person person = new Person();
  298. person.setUid("zhaosi");
  299. person.setSurname("赵");
  300. person.setGivenName("四");
  301. person.setUserPassword("123456");
  302. // required field
  303. person.setPersonName("赵四");
  304. person.setUidNumber("666");
  305. person.setGidNumber("666");
  306. person.setHomeDirectory("/home/zhaosi");
  307. person.setLoginShell("/bin/bash");
  308. personService.save(person);
  309. }
  310. /**
  311. * 测试删除
  312. */
  313. @Test
  314. public void deleteTest() {
  315. Person person = new Person();
  316. person.setUid("zhaosi");
  317. personService.delete(person);
  318. }
  319. }
  320. ```
  321. ## 其余代码参见本 demo
  322. ## 参考
  323. spring-data-ldap 官方文档: https://docs.spring.io/spring-data/ldap/docs/2.1.10.RELEASE/reference/html/