使用JNDI我可以使用用户的用户名和密码成功对我们的LDAP服务器进行身份验证,该服务器已禁用匿名绑定,如下所示:
Hashtable<String, Object> env = new Hashtable<String, Object>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, url);
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, userName);
env.put(Context.SECURITY_CREDENTIALS, password);
DirContext ctx = new InitialDirContext(env);
Attribute groups = ctx.getAttributes(userName).get("groupMembership");
现在我想使用Spring Boot,Spring Security和Spring LDAP做同样的事情。
我可以使用绑定DN和密码成功配置身份验证,如下所示:
DefaultSpringSecurityContextSource context = new DefaultSpringSecurityContextSource(ldapConfig.url);
context.setUserDn(ldapConfig.bindDn);
String bindPassword = passwordResolver.getPassword(ldapConfig.password);
context.setPassword(bindPassword);
context.afterPropertiesSet();
CustomAuthoritiesPopulator customAuthoritiesPopulator = new CustomAuthoritiesPopulator(context, ldapConfig.groupSearchBase);
String[] dnPatArr = new String[ldapConfig.userDnPatterns.size()];
ldapConfig.userDnPatterns.toArray(dnPatArr);
auth.ldapAuthentication()
.ldapAuthoritiesPopulator(customAuthoritiesPopulator)
.contextSource(context)
.userDnPatterns(dnPatArr)
.groupSearchBase(ldapConfig.groupSearchBase);
这样做 - Spring Boot webapp将成功验证我的用户。
但我想在不传递绑定DN和绑定密码的情况下这样做,就像我对JNDI示例所做的那样。
如果我只是省略设置绑定DN和密码,我将得到&#34; LDAP:错误代码48 - 匿名简单绑定已禁用。&#34;。
我不想进行匿名绑定 - 我希望Spring使用用户提供的用户名和密码对我的每个绑定DN模式进行简单绑定,直到有效。
我已经阅读了文档,但我很难确定这是否可行。 JNDI可以这样做,所以我认为我应该能够让Spring做到这一点。我已经考虑过编写自己的自定义Spring Security身份验证提供程序,但肯定没有必要。
答案 0 :(得分:0)
在JNDI中,身份验证信息在环境属性中指定。请确保属性名称拼写正确。
例如,凭据的环境属性为java.naming.security.credentials
而非java.naming.security.credential
。请注意,最后的missing letter 's'
会给出
&#34; LDAP:错误代码48 - 匿名简单绑定已禁用。&#34;
<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
<property name="environment">
<props>
<prop key="java.naming.factory.initial">com.sun.jndi.ldap.LdapCtxFactory</prop>
<prop key="java.naming.provider.url">ldap://serverURL/jndi_ctx
</prop>
<prop key="java.naming.security.authentication">simple</prop>
<prop key="java.naming.security.principal">user_id</prop>
<prop key="java.naming.security.credentials">password</prop>
</props>
</property>
</bean>