编写初步的测试链接代码如下,修改用户密码等我们是链接的是636端口而不是389
先简单的讲讲AD域和LdAP文件夹訪问协议:AD(active directory)活动文件夹,动态的建立整个域模式网络中的对象的数据库或索引,协议为LDAP,安装了AD的server称为DC域控制器,存储整个域的对象的信息并周期性更新!当中的对象分为三大类——资源(如印表机)、服务(如电子邮件)、和人物(即帐户或用户,以及组)。 LDAP是一个用来公布文件夹信息到很多不同资源的协议。通常它都作为一个集中的地址被使用,只是依据组织者的须要,它能够做得更加强大。
LDAP事实上是一个电话簿,类似于我们所使用诸如NIS(Network Information Service)、DNS (Domain Name Service)等网络文件夹,也类似于你在花园中所示树木。
不少LDAP开发者喜欢把LDAP与关系数据库相比,觉得是还有一种的存贮方式,然后在读性能上进行比較。实际上,这样的对照的基础是错误的。LDAP和关系数据库是两种不同层次的概念,后者是存贮方式(同一层次如网络数据库,对象数据库),前者是存贮模式和訪问协议。LDAP是一个比关系数据库抽象层次更高的存贮概念,与关系数据库的查询语言SQL属同一级别。LDAP最主要的形式是一个连接数据库的标准方式。该数据库为读查询作了优化。因此它能够非常快地得到查询结果,只是在其他方面,比如更新,就慢得多。AD域和LdAP文件夹訪问协议就介绍到这里!
public static void openSSLConnect() throws Exception {
String keystore = "D:\\Program Files\\jdk1.7.0_80\\jre\\lib\\security\\cacerts"; System.setProperty("javax.net.ssl.trustStore", keystore); Properties env = new Properties(); env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL, "ldap://ip地址:636"); env.put(Context.SECURITY_AUTHENTICATION, "simple"); env.put(Context.SECURITY_PRINCIPAL, "xxxx@xxx"); env.put(Context.SECURITY_CREDENTIALS, "12345678"); env.put(Context.SECURITY_PROTOCOL, "ssl"); env.put("java.naming.referral", "follow"); try { InitialLdapContext sss = new InitialLdapContext(env, null); System.out.println("成功了================"); sss.close(); } catch (NamingException e) { System.out.println("失败了================"); e.printStackTrace(); } }测试修改用户密码代码如下(测试成功):
String keystore = "D:\\Program Files\\jdk1.7.0_80\\jre\\lib\\security\\cacerts";
System.setProperty("javax.net.ssl.trustStore", keystore); Properties env = new Properties(); env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL, "ldap://xxx:636"); env.put(Context.SECURITY_AUTHENTICATION, "simple"); env.put(Context.SECURITY_PRINCIPAL, "xxx@xxx.xxx.com"); env.put(Context.SECURITY_CREDENTIALS, "123456Ab"); env.put(Context.SECURITY_PROTOCOL, "ssl"); env.put("java.naming.referral", "follow"); try { InitialLdapContext ldapCtx = new InitialLdapContext(env, null); ModificationItem[] mods = new ModificationItem[2]; String oldQuotedPassword = "\"123456Ab\""; byte[] oldUnicodePassword = oldQuotedPassword.getBytes("UTF-16LE"); String newQuotedPassword = "\"456789Ab\""; byte[] newUnicodePassword = newQuotedPassword.getBytes("UTF-16LE"); mods[0] = new ModificationItem(DirContext.REMOVE_ATTRIBUTE,new BasicAttribute("unicodePwd", oldUnicodePassword)); mods[1] = new ModificationItem(DirContext.ADD_ATTRIBUTE,new BasicAttribute("unicodePwd", newUnicodePassword)); String rootDn = getUserDN(ldapCtx,"xxx"); System.out.println("rootDn================"+rootDn); ldapCtx.modifyAttributes(rootDn, mods); System.out.println("成功了================"); ldapCtx.close(); } catch (NamingException e) { System.out.println("失败了================"); e.printStackTrace(); } catch (UnsupportedEncodingException e) { System.out.println("失败了2w2w================"); e.printStackTrace(); }特别注意密码格式,这是策略 一定要按照红色部分来做的
原因:这个最大的可能是不满足域安全策略:如密码复杂性、密码最短使用期限、强制密码历史。即长度、包含的字符、多久可以修改密码、是否可以使用历史密码等
在代码中我们用REMOVE_ATTRIBUTE和ADD_ATTRIBUTE在这个方法,而没用REPLACE_ATTRIBUTE这是因为REPLACE是管理员操作的权限,而用户自己是不能用REPLACE的