Java 没有用户名/密码的简单安全身份验证会产生结果

Java 没有用户名/密码的简单安全身份验证会产生结果,java,ldap,apacheds,Java,Ldap,Apacheds,为什么这样做有效 env.put(Context.PROVIDER_URL, "ldap://localhost:10389/o=csRepository"); env.put(Context.SECURITY_AUTHENTICATION, "simple"); //env.put(Context.SECURITY_PRINCIPAL, "cn=John Eipe, ou=employees, o=csRepository"); //env.put(Context.SECURITY_CREDE

为什么这样做有效

env.put(Context.PROVIDER_URL, "ldap://localhost:10389/o=csRepository");
env.put(Context.SECURITY_AUTHENTICATION, "simple");
//env.put(Context.SECURITY_PRINCIPAL, "cn=John Eipe, ou=employees, o=csRepository");
//env.put(Context.SECURITY_CREDENTIALS, "qwer1234");

DirContext ctx = new InitialDirContext(env);
//operations on ctx

我的理解是,当安全认证被指定为简单,并且没有指定用户名或密码时,它应该抛出javax.naming.AuthenticationException

已解决。可悲的是,这就是它的工作原理。 在Oracle文档中有如下说明

如果向提供空字符串、空字节/字符数组或null Context.SECURITY\u CREDENTIALS环境属性,然后 身份验证机制将为“无”。这是因为LDAP 对于简单身份验证,要求密码为非空。这个 协议会自动将身份验证转换为“无” 未提供密码


这会导致严重的安全漏洞。但是,我想应该由应用程序来验证。

可能是因为凭据被缓存了?您最初拥有代码,然后将其注释掉,对吗?为了验证我的假设-取消对身份验证行的注释,然后更改密码,使其失败。再次注释-它仍然失败吗?不,是一样的。顺便说一句,缓存在哪里?我是从psvm代码运行的。这确实是一个大漏洞!感谢分享解决方案!