配置Spring Security以在没有匿名且没有绑定DN的情况下针对LDAP进行身份验证

时间:2016-01-07 20:46:28

标签: java spring spring-security spring-ldap

使用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身份验证提供程序,但肯定没有必要。

1 个答案:

答案 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>