LDAP之JNDI修改条目密码

 

(一) 开发配置场景

 

LDAPServer

OpenLDAP

配置密码存储方式

MD5

LDAP Client测试

JNDI

LDAP Client测试

JLDAP

(二)实践

 

  1. 确认LDAP Server 密码存储方式,如MD5SHASSHA
  2. 确认LDAP Server密码存储规则,如OpenLDAP支持的MD5密码串必须还得经过Base64编码。
  3. 基于MD5的LDAP Server条目密码存储实践。
    1. 流程图

 

LDAP之JNDI修改条目密码_第1张图片 

 

  1. 示例代码

 

<textarea cols="79" rows="15" name="code" class="java"> /** * 修改给定DN条目的密码 * &lt;p&gt;&lt;strong&gt;注意:条目必须支持userPassword属性&lt;/strong&gt;&lt;/p&gt; * @param dn 给定DN * @param passwd 密码 * @param type 密码存储方式{MD5,SHA,etc} * @return rtnFlag {true:成功;false:失败} */ public boolean modifyPassword(String dn, String passwd, int type) { Attributes attrs = new BasicAttributes(); attrs.put("userPassword", LDAPSecurityUtils.getOpenLDAPMD5(passwd)); boolean rtnFlag = false; try { this.ctx.modifyAttributes(dn, DirContext.REPLACE_ATTRIBUTE, attrs); rtnFlag = true; } catch (NamingException e) { e.printStackTrace(); } return rtnFlag; }</textarea>

 

  1. 出现的问题
    1. 缓存问题,我用客户端修改了某用户的密码,但从其它客户端查询时密码并没有改变。
      1. 需要重启LDAP Server之后才真正看到变更。
      2. 这个问题如果直接使用JNDI倒是很正常。
      3. 由此说来问题出在JLDAP连接配置管理那块。
    1. OpenLDAP 存储的密码以MD5举例,它的MD5不是普通的MD5它有自己的规则,如下所述:
      1. 首先将明文转为MD5字节组
      2. 将字节组进行Base64处理
      3. 给经Base64处理完成的字符串加前缀{MD5}
      4. 同理,SHASSHA应该也是做类似操作吧?(还未进行验证)

 

(三) 参考资料

  • 示例代码下载
  1. http://download.csdn.net/source/3310678
  2. http://download.csdn.net/source/3305804
  • Base64实现原理 http://baike.baidu.com/view/469071.htm
  • PHP方式实现  http://www.ixpub.net/thread-2055529-1-1.html

你可能感兴趣的:(LDAP之JNDI修改条目密码)