java ldap userpassword 解密_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或入门2)
  • 在pom.xml中引入两个重要依赖
ebd969bacd218aa0144cf98938c8ac31.png

其中,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服务端的基础数据,以备后面的程序访问之用。
0f54d4a18864728116802f4182d34d4f.png

这里创建了一个基础用户,真实姓名为zhaiyongchao,常用名didi,在后面的程序中,我们会来读取这些信息。更多内容解释大家可以深入学习LDAP来理解,这里不做过多的讲解。

  • 在application.properties中添加嵌入式LDAP的配置
7414e7fbe733081a89485ad11ea5112d.png
  • 使用spring-data-ldap的基础用法,定义LDAP中属性与我们Java中定义实体的关系映射以及对应的Repository
5b654b93f1bb3397f6013931245e12a8.png

通过上面的定义之后,已经将Person对象与LDAP存储内容实现了映射,我们只需要使用PersonRepository就可以轻松的对LDAP内容实现读写。

  • 创建单元测试用例读取所有用户信息:
fcd1b5b27ae0ee63541de46306b44e3d.png

启动该测试用例之后,我们可以看到控制台中输出了刚才维护在ldap-server.ldif中的用户信息:

2018-01-27 14:25:06.283 WARN 73630 --- [ main] o.s.ldap.odm.core.impl.ObjectMetaData : The Entry class Person should be declared finalPerson(id=uid=ben,ou=people,dc=didispace,dc=com, uid=ben, commonName=didi, suerName=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中添加用户:

7288b4814d33e277a895ed210a146f42.png

如果还想实现更多操作,您可以参考spring-data-ldap的文档来进行使用。

连接LDAP服务端

在本文的例子中都采用了嵌入式的LDAP服务器,事实上这种方式也仅限于我们本地测试开发使用,真实环境下LDAP服务端必然是独立部署的。

在Spring Boot的封装下,我们只需要配置下面这些参数就能将上面的例子连接到远端的LDAP而不是嵌入式的LDAP。

f18fb018ad90f3d8be8b96fe3c307839.png
6aaea0b2d441a324b0c1935fd2a6678c.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/395370.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第三章之枚举、注解

2019-01-22内容:枚举、注解一、自定义一个枚举类1 public class TestSeason {2 3 public static void main(String[] args) {4 Season spring Season.Spring;5 System.out.println(spring);6 }7 }8 public class Season {9 //将属性定…

html打开后默认浏览器页面,使用VBA打开默认浏览器中的html页面?

您可以使用Windows API函数ShellExecute来执行此操作:Option ExplicitPrivate Declare Function ShellExecute _Lib "shell32.dll" Alias "ShellExecuteA" ( _ByVal hWnd As Long, _ByVal Operation As String, _ByVal Filename As String, _Op…

数据科学r语言_您应该为数据科学学习哪些语言?

数据科学r语言Data science is an exciting field to work in, combining advanced statistical and quantitative skills with real-world programming ability. There are many potential programming languages that the aspiring data scientist might consider specializi…

Linux平台不同解压缩命令的使用方法

作者:郭孝星 微博:郭孝星的新浪微博 邮箱:allenwells163.com 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell 一 .tar 解包 tar xvf FileName.tar 打包 tar cvf FileName.tar DirName 注意…

unity中怎么做河流_【干货】工作中怎么做工业设计的?(一)

最近在找工作,一直在看招聘信息。看到工业设计工资还是蛮高的。应届毕业生一般是4-6K,1-3年工作经验是6-8K,3年以后的差不多是8K以上了。我没有嫉妒羡慕恨,发誓,真的没有。工业设计已经被重视,未来的道路会…

[易学易懂系列|golang语言|零基础|快速入门|(一)]

golang编程语言,是google推出的一门语言。 主要应用在系统编程和高性能服务器编程,有广大的市场前景,目前整个生态也越来越强大,未来可能在企业应用和人工智能等领域占有越来越重要的地位。 本文章是【易学易懂系列|编程语言入门】…

APUE学习之三个特殊位 设置用户ID(set-user-ID),设置组ID(set-group-ID),sticky...

设置用户ID(set-user-ID),设置组ID(set-group-ID),stickyset-user-ID: SUID当文件的该位有设置时,表示当该文件被执行时,程序具有文件所有者的权限而不是执行者的权限。这样说有点绕…

微信调用html退后方法,微信浏览器后退关闭页面

不需要引用 微信jssdk 关闭浏览器WeixinJSBridge.invoke(closeWindow, {}, function (res) { });参考:https://mp.weixin.qq.com/wiki/12/7dd29a53f4b55a8ddc6177ab60e5ee2c.html监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法参考&#xff…

在gitlab 中使用webhook 实现php 自动部署git 代码

在技术团队讨论中,我们决定从svn 迁移到 git ,于是使用了gitlab,代码自动部署使用了webhook在服务器上 1.开启PHP需要的环境支持 服务器环境必须先安装git 环境,webhook 依赖php运行环境,同时需要使用shell_exec 和 exec 等函数。…

spi收发时的寄存器sr不变_「正点原子Linux连载」第二十七章SPI实验(二)

1)实验平台:正点原子Linux开发板2)摘自《正点原子I.MX6U嵌入式Linux驱动开发指南》关注官方微信号公众号,获取更多资料:正点原子文件bsp_spi.c中有两个函数:spi_init和spich0_readwrite_byte,函数spi_init是SPI初始化函…

vue脚手架vue数据交互_学习Vue:3分钟的交互式Vue JS教程

vue脚手架vue数据交互Vue.js is a JavaScript library for building user interfaces. Last year, it started to become quite popular among web developers. It’s lightweight, relatively easy to learn, and powerful.Vue.js是用于构建用户界面JavaScript库。 去年&#…

[JSOI2018]潜入行动

题解 一道思路不难但是写起来很麻烦的树形背包 我们发现每个节点有很多信息需要保留 所以就暴力的设\(f[u][j][0/1][0/1]\)表示点u的子树分配了j个监察器,点u有没有被控制,点u放没放监察器 然后就分四种情况暴力讨论就好了 注意背包的时候要卡常数 代码 #include<cstdio>…

css。元素样式、边框样式

1.外边距  margin 缩写形式&#xff1a; margin&#xff1a;上边距  右边距  下边距  左边距 margin&#xff1a;上下边距  左右边距 margin&#xff1a;上边距  左右边距  下边距 2.内边距  padding 缩写形式&#xff1a; padding&#xff1a;上边距  右边距…

html文本对齐6,HTML对齐文本

我要像以下列方式显示页面上的文本&#xff1a;HTML对齐文本My Text: Text HereMy Text: More Text Here.........................................................Text from line above continued here.我有以下的标记只是为了测试&#xff1a;body {font-family: arial;}fo…

vue底部跳转_详解Vue底部导航栏组件

不多说直接上代码 BottomNav.vue&#xff1a;{{item.name}}export default{props:[idx],data(){return {items:[{cls:"home",name:"首页",push:"/home",icon:"../static/home.png",iconSelect:"../static/home_select.png"}…

Android Studio环境搭建

Android Studio环境搭建 个人博客 欢迎大家多多关注该独立博客。 ###[csdn博客]&#xff08;http://blog.csdn.net/peace1213&#xff09; 一直想把自己的经验分享出来&#xff0c;记得上次写博客还是ok6410的笔记。感觉时代久远啊。记得那个时候我还一心想搞硬件了。如今又一次…

hacktoberfest_Hacktoberfest和其他有趣的事情将在本周末在freeCodeCamp

hacktoberfestby Quincy Larson昆西拉尔森(Quincy Larson) Hacktoberfest和其他有趣的事情将在本周末在freeCodeCamp (Hacktoberfest and other fun things going on this weekend at freeCodeCamp) Earlier this month, the freeCodeCamp community turned 3 years old. And …

C# 动态创建数据库三(MySQL)

前面有说明使用EF动态新建数据库与表&#xff0c;数据库使用的是SQL SERVER2008的&#xff0c;在使用MYSQL的时候还是有所不同 一、添加 EntityFramework.dll &#xff0c;System.Data.Entity.dll &#xff0c;MySql.Data, MySql.Data.Entity.EF6 注意&#xff1a;Entity Frame…

iOS开发Swift篇—(七)函数(1)

一、函数的定义 &#xff08;1&#xff09;函数的定义格式 1 func 函数名(形参列表) -> 返回值类型 { 2 // 函数体... 3 4 } &#xff08;2&#xff09;形参列表的格式 形参名1: 形参类型1, 形参名2: 形参类型2, … &#xff08;3&#xff09;举例&#xff1a;计算2个…

如何用计算机管理员权限,教你电脑使用代码添加管理员权限的详细教程

我们在使用电脑运行某些软件的时候&#xff0c;可能需要用到管理员权限才能运行&#xff0c;通常来说直接点击右键就会有管理员权限&#xff0c;但最近有用户向小编反馈&#xff0c;在需要管理员权限的软件上点击右键没有看到管理员取得所有权&#xff0c;那么究竟该如何才能获…