2023年6月21日发(作者:)

ldap统⼀认证java_如何在你的系统⾥集成LDAP统⼀认证⼀、为什么需要统⼀认证⽇常办公经常会有多套系统,如果各个系统各⾃维护⼀套⽤户认证,⽤户需要记住多个⽤户名密码。 系统各⾃管理⽤户认证的⽅式,不但会有重复建设的问题,⽤户体验也会差,经常会有⽤户忘记密码的情况。⼆、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认证服务架构图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语⾔为例演⽰两次绑定的过程:⾸先添加依赖:dap4.3两次绑定代码:public string bind(String username, String password) {LDAPConnection ldapConnection = new LDAPConnection();t(_HOST, _PORT);(_V3, _BIND_DN,_BIND_es("UTF8"));try {String filter = ("(|(mail=%s)(uid=%s))", username, username);LDAPSearchResults results = (_BIND_BASE, _SUB, filter,null, false);LDAPEntry nextEntry, nextUserEntry;while (e()) {try {nextEntry = ();} catch (LDAPException e) {if (ultCode() == _TIMEOUT || ultCode() == T_ERROR) {break;} else {continue;}}String dn = ();(_V3, dn, es("UTF8"));LDAPSearchResults userResults = (_BIND_BASE, _SUB,("(|(mail=%s)(uid=%s))", username, username), null, false);while (e()) {try {nextUserEntry = ();} catch (LDAPException e) {if (ultCode() == _TIMEOUT || ultCode() == T_ERROR) {break;} else {continue;}}if (nextUserEntry == null) {continue;}String userDn = ();if (!OrEmpty(userDn) && (dn)) {//登录成功}}}} catch (LDAPException e) {("get LDAPException:", e);} catch (UnsupportedEncodingException e) {("get UnsupportedEncodingException:", e);} finally {nect();}return null;}

2023年6月21日发(作者:)

ldap统⼀认证java_如何在你的系统⾥集成LDAP统⼀认证⼀、为什么需要统⼀认证⽇常办公经常会有多套系统,如果各个系统各⾃维护⼀套⽤户认证,⽤户需要记住多个⽤户名密码。 系统各⾃管理⽤户认证的⽅式,不但会有重复建设的问题,⽤户体验也会差,经常会有⽤户忘记密码的情况。⼆、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认证服务架构图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语⾔为例演⽰两次绑定的过程:⾸先添加依赖:dap4.3两次绑定代码:public string bind(String username, String password) {LDAPConnection ldapConnection = new LDAPConnection();t(_HOST, _PORT);(_V3, _BIND_DN,_BIND_es("UTF8"));try {String filter = ("(|(mail=%s)(uid=%s))", username, username);LDAPSearchResults results = (_BIND_BASE, _SUB, filter,null, false);LDAPEntry nextEntry, nextUserEntry;while (e()) {try {nextEntry = ();} catch (LDAPException e) {if (ultCode() == _TIMEOUT || ultCode() == T_ERROR) {break;} else {continue;}}String dn = ();(_V3, dn, es("UTF8"));LDAPSearchResults userResults = (_BIND_BASE, _SUB,("(|(mail=%s)(uid=%s))", username, username), null, false);while (e()) {try {nextUserEntry = ();} catch (LDAPException e) {if (ultCode() == _TIMEOUT || ultCode() == T_ERROR) {break;} else {continue;}}if (nextUserEntry == null) {continue;}String userDn = ();if (!OrEmpty(userDn) && (dn)) {//登录成功}}}} catch (LDAPException e) {("get LDAPException:", e);} catch (UnsupportedEncodingException e) {("get UnsupportedEncodingException:", e);} finally {nect();}return null;}