ldap 统一认证 java_如何在你的系统里集成LDAP统一认证「建议收藏」

一、为什么需要统一认证日常办公经常会有多套系统,如果各个系统各自维护一套用户认证,用户需要记住多个用户名密码。系统各自管理用户认证的方式,不但会有重复建设的问题,用户体验也会差,经常会有用户忘记密码的情况。二、LDAP统一认证是什么LDAP是LightweightDirectoryAccessProtocol(轻量级目录访问协议)的缩写,它是基于X.500标准的轻量组播目录访问协议。目录…

大家好,又见面了,我是你们的朋友全栈君。

一、为什么需要统一认证

日常办公经常会有多套系统,如果各个系统各自维护一套用户认证,用户需要记住多个用户名密码。 系统各自管理用户认证的方式,不但会有重复建设的问题,用户体验也会差,经常会有用户忘记密码的情况。

二、LDAP统一认证是什么

LDAP是Light weight Directory Access Protocol(轻量级目录访问协议)的缩写,它是基于X.500标准的轻量组播目录访问协议。

目录是一个为查询、浏览和搜索而优化的数据库,它成树状结构组织数据。目录数据库和关系数据库不同,它有优异的读性能,但写性能很差,没有事务处理、回滚等复杂操作,不适合存储修改频繁的数据。适合存储人员组织、电话簿和地址簿等信息。

三、LDAP的基本模型

3.1 信息模型

LDAP中信息以树状方式组织,数据的基本单元是条目,每个条目由属性构成,属性中存储有属性值。

3.2 命名模型

LDAP中的命名模型,也即LDAP中条目的定位方式。

每个条目有自己的DN,DN是该条目在整个树中的唯一名称标识,如同文件系统中带路径的文件名。

3.3 功能模型

LDAP中支持四类操作: 查询类操作、更新类操作、认证类操作和其它操作;

3.4 安全模型

LDAP的安全模型主要通过身份认证、安全通道和访问控制来实现。

四、LDAP认证的过程

4.1 访问LDAP认证服务架构图

870c098f17a55ed943f057ba476eb27d.png

4.2 身份验证的步骤

LDAP利用登录名和密码进行验证,进行身份验证通常需要以下步骤:

1、通过用户登录获取用户名密码。

2、匿名或默认用户绑定LDAP服务器,绑定成功后执行下面步聚。

3、根据输入的登录名,执行一个搜索。请求参数形如:”(|(uid={login})(mail={login}))“,请求如果返回一个entry,可以通过该entry得到DN,后面步聚使用。如果返回多个或没有返回,说明用户输入用户名有误,验证失败。

4、如果上一步验证成功,得到用户信息所在entry的DN,使用这个DN和用户输入password重新绑定LDAP服务器。如果绑定成功,说明验证成功。绑定失败,返回密码错误的信息。

4.3 为什么需要两次绑定

为什么基于LDAP进行验证需要“两次”绑定? 为什么不能直接取出密码进行比较?

主要是出于安全考虑,LDAP服务器对于password属性一般是不可读的。

4.4 LDAP搜索参数表达式

& 与(列表中所有项必须为true)

| 或(列表中至少一个必须为true)

! 非(求反的项不能为true)

= 相等(根据属性的匹配规则)

~= 近似等于(根据属性的匹配规则)

>= 大于(根据属性的匹配规则)

<= 小于(根据属性的匹配规则)

=* 存在(条目中必须有这个属性,但值不做限制)

* 通配符(表示这个位置可以有一个或多个字符),当指定属性值时用到

\ 转义符(当遇到“*”,“(”,“)”时进行转义)

五、如何在系统中集成LDAP认证

LDAP认证服务是跨平台,同时支持TCP/IP协议。在系统中两次绑定LDAP服务器成功,代表登录成功,否则登录失败。

下面以Java语言为例演示两次绑定的过程:

首先添加依赖:

com.novell.ldap

jldap

4.3

两次绑定代码:

public string bind(String username, String password) {

LDAPConnection ldapConnection = new LDAPConnection();

ldapConnection.connect(Constants.LDAP_HOST, Constants.LDAP_PORT);

ldapConnection.bind(LDAPConnection.LDAP_V3, Constants.LDAP_BIND_DN, Constants.LDAP_BIND_PASSWORD.getBytes(“UTF8”));

try {

String filter = String.format(“(|(mail=%s)(uid=%s))”, username, username);

LDAPSearchResults results = ldapConnection.search(Constants.LDAP_BIND_BASE, LDAPConnection.SCOPE_SUB, filter, null, false);

LDAPEntry nextEntry, nextUserEntry;

while (results.hasMore()) {

try {

nextEntry = results.next();

} catch (LDAPException e) {

if (e.getResultCode() == LDAPException.LDAP_TIMEOUT || e.getResultCode() == LDAPException.CONNECT_ERROR) {

break;

} else {

continue;

}

}

String dn = nextEntry.getDN();

ldapConnection.bind(LDAPConnection.LDAP_V3, dn, password.getBytes(“UTF8”));

LDAPSearchResults userResults = ldapConnection.search(Constants.LDAP_BIND_BASE, LDAPConnection.SCOPE_SUB, String.format(“(|(mail=%s)(uid=%s))”, username, username), null, false);

while (userResults.hasMore()) {

try {

nextUserEntry = userResults.next();

} catch (LDAPException e) {

if (e.getResultCode() == LDAPException.LDAP_TIMEOUT || e.getResultCode() == LDAPException.CONNECT_ERROR) {

break;

} else {

continue;

}

}

if (nextUserEntry == null) {

continue;

}

String userDn = nextUserEntry.getDN();

if (!Strings.isNullOrEmpty(userDn) && userDn.equals(dn)) {

//登录成功

}

}

}

} catch (LDAPException e) {

logger.warn(“get LDAPException:”, e);

} catch (UnsupportedEncodingException e) {

logger.warn(“get UnsupportedEncodingException:”, e);

} finally {

ldapConnection.disconnect();

}

return null;

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/126400.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 我的世界全自动刷矿机_我的世界服务器刷物资

    我的世界全自动刷矿机_我的世界服务器刷物资我的世界游戏中玩家可以操作一个建筑工人通过各种方块的摆放和破坏,来建造一个自己的世界,其中矿石的作用在游戏中是非常重要的,本次带来的我的世界刷矿机MOD就可以帮助玩家刷出的石头的同时有一定的几率变为各种矿石,助您轻松获取矿石资源!MOD功能当刷石机刷出石头后,石头有一定几率变成钻石、青金石、黄金、铁、红石矿石。使用方法MOD适用于游戏版本v1.12.2,需要Forge14.23.5.2768安装…

    2022年9月30日
  • 优先队列的优先级_kafka优先级队列

    优先队列的优先级_kafka优先级队列概念☺优先队列是一种用来维护一组元素构成的结合S的数据结构,其中每个元素都有一个关键字key,元素之间的比较都是通过key来比较的。优先队列包括最大优先队列和最小优先队列,优先队列的应用比较广泛,比如作业系统中的调度程序,当一个作业完成后,需要在所有等待调度的作业中选择一个优先级最高的作业来执行,并且也可以添加一个新的作业到作业的优先队列中。优先队列的实现中,我们可以选择堆数据结构,最…

    2022年9月14日
  • 垃圾清理代码_一招清理电脑垃圾

    垃圾清理代码_一招清理电脑垃圾hello,大家好,我是你们的小雨哥哥。今天要教大家的是如何一键清理电脑的垃圾文件。众所周知,电脑用久了会越来越卡,运行的越来越慢,这其中除了硬件的损耗之外,还有一个原因就是电脑的垃圾文件越来越多,缓存文件越来越多。很多程序,例如浏览器,在使用过一次之后,为了下次打开的速度快一点,它会自动保留一下缓存文件,然后等待下来打开的时候就不用去请求服务器了,直接读取电脑本地的缓存…

    2022年6月18日
  • Pandas个人操作练习(1)创建dataframe及插入列、行操作

    Pandas个人操作练习(1)创建dataframe及插入列、行操作使用pandas之前要导入包:importnumpyasnpimportpandasaspdimportrandom#其中有用到random函数,所以导入一、dataframe创建pandas.DataFrame(data=None,index=None,columns=None,dtype=None,copy=False)data:numpy…

    2022年4月27日
  • python官方库和第三方库_网络爬虫第三方库

    python官方库和第三方库_网络爬虫第三方库Python的强大之处除了它的简洁易用,最厉害的就是它有着广泛的第三方库支持。今天小编就带你看下Python有哪些常用第三库吧,知道且用过超过10个的欢迎留言~文本处理与格式转换Char…

    2022年11月1日
  • 如何关闭vscode git工具[通俗易懂]

    如何关闭VScode工具的git提示只需要关闭用户设置里的Git:Enabled即可;第一步,我们只需要打开”文件->首选项->设置”第二步,在搜索栏中搜索git:Enabled,关闭即可;…

    2022年4月10日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号