LDAP:空的binddn“”和身份验证类型从无变得简单

Posted

技术标签:

【中文标题】LDAP:空的binddn“”和身份验证类型从无变得简单【英文标题】:LDAP: Empty binddn“” and Authentication type becomes simple from none 【发布时间】:2019-10-27 01:01:35 【问题描述】:

我正在使用 Spring Security 在 Spring MVC 和 JPA 中开发应用程序。现在通过 LDAP 集成 OUD(Oracle 统一目录)。用户身份验证时,OUD 日志文件中来自 LDAP 的响应是

CONNECT conn=909681 从 ******* 到 *******:1636 协议=LDAPS

绑定 REQ conn=909681 op=0 msgID=1 type=SIMPLE dn="" version=3

BindRES conn=909681 op=0 msgID=1 result=1 message="目录 服务器找不到绑定 dn“”的网络组,因为 客户端连接不符合任何连接条件 网络组。”

DISCONNECT conn=909681 reason="客户端断开连接"

security.xml文件中应用与LDAP的映射

<bean id="contextSource" class="org.springframework.security.ldap.DefaultSpringSecurityContextSource">
    <constructor-arg value="ldaps://192.168.0.182:1636/o=company"/>
    <property name="userDn" value="cn=userid,ou=groups,o=company"/>
    <property name="password" value="password"/>
</bean>

<bean id="ldapAuthProvider" class="org.springframework.security.ldap.authentication.LdapAuthenticationProvider" >
     <constructor-arg>
          <bean class="in.web.service.impl.CustomLdapBindAuthenticator">
               <constructor-arg ref="contextSource"/>
               <property name="userDnPatterns">
                   <list>
                       <value>cn=0,ou=groups</value>
                   </list>
               </property>
           </bean>
     </constructor-arg>
     <constructor-arg>
           <bean class="in.web.service.impl.CustomLdapUserAuthoritiesPopulator">
           </bean>
     </constructor-arg>     
 </bean>

CustomLdapBindAuthenticator 中的代码

public LdapUserDetails search(String cn) throws Exception 
        Hashtable env = new Hashtable();
        String sp = "com.sun.jndi.ldap.LdapCtxFactory";
        env.put(Context.INITIAL_CONTEXT_FACTORY, sp);

        String [] urls = contextSource.getUrls();
        for(String url: urls)
            System.out.println("ldapurls="+url);
        
        env.put(Context.PROVIDER_URL, urls[0]);

        DirContext dctx = new InitialDirContext(env);

        String base = "ou=groups,o=company";
        System.out.println("BASE DN="+base);

        SearchControls sc = new SearchControls();
        String[] attributeFilter = "cn", "fullName", "mail", "l", "mobile";
        sc.setReturningAttributes(attributeFilter);
        sc.setSearchScope(SearchControls.SUBTREE_SCOPE);

        String filter = "(&(cn="+cn+")(objectClass=*))";

        NamingEnumeration results = dctx.search(base, filter, sc);
        LdapUserDetails user = new LdapUserDetails();
        while (results.hasMore()) 
            SearchResult sr = (SearchResult) results.next();
            Attributes attrs = sr.getAttributes();

            user.setCn(getAttribute(attrs, "cn"));
            user.setFullName(getAttribute(attrs, "fullName"));
            user.setMail(getAttribute(attrs, "mail"));
            user.setMobile(getAttribute(attrs, "mobile"));
            user.setLocation(getAttribute(attrs, "l")); 
        
        dctx.close();
        return user;
        

Pl。帮我解决问题

    我没有提到简单的身份验证。我从哪里得到 type=simple 在日志文件中 为什么我得到 dn="" 提前致谢

【问题讨论】:

【参考方案1】:

似乎没有network group 允许您的源IP 访问该目录。由于没有匹配的网络组,您会在错误字符串中看到空 DN。管理网络组的方法有两种:

ODSM Web Mgmt GUI:“配置”选项卡,常规配置 => 网络组

LDAP 到配置目录(默认端口 4444):cn=network groups,cn=config

另外,这可能是您删除私人信息时引入的问题,ID 不会是 cn=userid,o=company,ou=groups 而是 cn=userid,ou=groups,o=company(并且那么只有当用户在一个名为 groups 的 OU 中时。我通常会在一个名为 groups 的 OU 中看到 group 对象,而在一个名为 users 或 员工。)

ETA:Simple 是 Spring LDAP 中使用的默认身份验证机制。您需要设置 DirContextAuthenticationStrategy 以使用另一种机制。

【讨论】:

感谢您的建议。我是 LDAP 新手。我对日志文件的理解是 3 是 ldap 版本并添加了 env.put(Context.SECURITY_AUTHENTICATION, "none");此代码将解决此问题。据我了解,没有身份验证,那么我们不需要 security.xml 中的代码 对吗 这是正确的 if 允许匿名绑定。出于安全原因,许多管理员不允许匿名绑定。 感谢您的意见。在 security.xml 中是否需要此代码或在任何身份验证类型中都不需要 因为如果类型很简单,我们是通过 security_authentication、security_principal、security_credentials 来传递值

以上是关于LDAP:空的binddn“”和身份验证类型从无变得简单的主要内容,如果未能解决你的问题,请参考以下文章

身份验证是如何建立在 LDAP 上的?

集成OpenLDAP与Kerberos实现统一认证:基于SSSD同步LDAP账号

集成OpenLDAP与Kerberos实现统一认证:基于SSSD同步LDAP账号

通过 LDAP 存储库验证 LDAP

LDAP JBoss 和 Drupal 身份验证

Spring 安全切换到 Ldap 身份验证和数据库权限