当前版本: apacheds-2.0.0.AM26
1. 声明当前内容主要为学习和使用Apache DS,并完成修改端口和密码的 *** 作,当前内容参考:官方文档
主要为:
- 手动修改启动端口 (修改10389为389)使用java方式修改当前的登录密码 (默认密码为secret)
找到特定具有10389的文件夹位置:apacheds-2.0.0.AM26/instances/default/conf/ou=config/ads-directoryserviceid=default/ou=servers/ads-serverid=ldapserver/ou=transports,该文件夹下面的两个文件控制端口
其中ads-transportid=ldap.ldif控制端口10389,ads-transportid=ldaps.ldif控制端口10636
关闭apacheds:./bin/apacheds.sh stop
将文件下载到本地并修改属性后上传至服务器即可,这里修改为389端口
再次启动apacheds: ./bin/apacheds.sh start
查看当前端口:
发现端口修改成功
查看官方图片
可以发现当前用户admin的密码是存在于:ou=system这个partition中的uid=admin这个实体中的userPassword属性的,可以通过手动切换到实体并修改属性即可完成密码修改
通过查看属性和调试发现密码刚开始是secret,且是byte[],所以修改的时候直接用byte[]替换,但是修改后却变成了{SSHA}XXX
实现如下:
private static HashtablecreateEnv() { Hashtable env = new Hashtable (); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL, "ldap://" + HOST + ":389"); env.put(Context.SECURITY_PRINCIPAL, "uid=admin,ou=system"); env.put(Context.SECURITY_CREDENTIALS, "secret"); return env; } private static void changeAdminPassword() { // 填充必要的配置属性,例如连接用户名和密码以及访问的ldpa的IP和端口 Hashtable env = createEnv(); // 创建对Dir访问 *** 作的上下文 DirContext ctx = null; try { ctx = new InitialDirContext(env); // 查询ou=schema这个文件夹下面的内容 NamingEnumeration list = ctx.list("ou=system"); listNamingEnumeration(list); DirContext adminContext = (DirContext)ctx.lookup("uid=admin,ou=system"); Attributes attributes = adminContext.getAttributes(""); listAttributes(attributes); Attribute attribute = attributes.get("userPassword"); byte[] pwdBytes = (byte[])attribute.get(0); System.out.println("当前的密码为:"+new String(pwdBytes, "utf-8")); // 手动修改这个密码,并设置为123456 String newPwd="123456"; BasicAttributes basicAttributes = new BasicAttributes("userPassword", newPwd.getBytes("utf-8")); // 如果使用DirContext.ADD_ATTRIBUTE表示可以使用多个密码进行登录 *** 作 adminContext.modifyAttributes("", DirContext.REPLACE_ATTRIBUTE, basicAttributes); System.out.println("修改密码成功!"); } catch (Exception e) { e.printStackTrace(); } finally { close(ctx); } }
执行后的结果:
uid=admin: javax.naming.directory.DirContext prefNodeName=sysPrefRoot: javax.naming.directory.DirContext ou=configuration: javax.naming.directory.DirContext ou=consumers: javax.naming.directory.DirContext ou=users: javax.naming.directory.DirContext ou=groups: javax.naming.directory.DirContext ====list attributes ===== id=uid admin id=userPassword [B@17f052a3 id=displayName Directory Superuser id=objectClass top person organizationalPerson inetOrgPerson id=sn administrator id=cn system administrator 当前的密码为:secre 修改密码成功!
再次执行后(由于没有修改密码):
javax.naming.AuthenticationException: [LDAP: error code 49 - INVALID_CREDENTIALS: Bind failed: ERR_229 Cannot authenticate user uid=admin,ou=system]
这个表示认证失败了,因为密码修改了
当修改了登录密码正确就可以继续访问了:
1. 通过修改配置文件方式修改端口时,必须要经过重启服务才会让配置重新生效
2. 修改密码 *** 作时需要切换到不同的用户下面,且修改其中的密码属性即可,直接替换属性即可,如果使用DirContext.ADD_ATTRIBUTE那么表示该用户可以使用多个密码进行登录
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)