刘大猫. 2024-05-23 20:19 采纳率: 44.4%
浏览 6

LDAP: error code 34 - invalid DN

java链接ldap报错LDAP: error code 34 - invalid DN

ldap配置如下

dn:olcDatabase={2}hdb,cn=config
changetype:modify
replace:olcSuffix
olcSuffix:dc=yaobili,dc=com
 
dn:olcDatabase={2}hdb,cn=config
changetype:modify
replace:olcRootDN
olcRootDN:cn=admin,dc=yaobili,dc=com
 
dn:olcDatabase={2}hdb,cn=config
changetype:modify
replace:olcRootPW
olcRootPW:{SSHA}IHveDAPJPxUFiKF17cVPg3Humkh1GjJj
 
dn:olcDatabase={2}hdb,cn=config
changetype:modify
add:olcAccess
olcAccess:{0}to attrs=userPassword,shadowLastChange by dn="cn=admin,dc=yaobili,dc=com" write by anonymous auth by self write by * none
olcAccess:{1}to dn.base="" by * read
olcAccess:{2}to * by dn="cn=admin,dc=yaobili,dc=com" write by * read



dn:ou=Develop,ou=Hytera,dc=yaobili,dc=com
objectClass:organizationalUnit
ou:Develop


创建组织架构
dn:ou=Hytera,dc=yaobili,dc=com
objectClass:organizationalUnit
ou:Hytera

dn:ou=Develop,ou=Hytera,dc=yaobili,dc=com
objectClass:organizationalUnit
ou:Develop

创建用户
dn: cn=ldapUser1,ou=Develop,ou=Hytera,dc=yaobili,dc=com
objectClass: inetOrgPerson
cn: ldapUser1
username: ldapUser1
userPassword: Eadmin123456
memberOf: ou=Develop,ou=Hytera,dc=yaobili,dc=com

下面是我的代码

application.properties

server.port=8020

spring.ldap.urls=ldap://10.110.38.162:389
spring.ldap.username=admin
spring.ldap.password=123456
spring.ldap.base=dc=yaobili,dc=com

LdapConfiguration

package com.ldap.config;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.ldap.core.LdapTemplate;
import org.springframework.ldap.core.support.LdapContextSource;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;


/**
 * LDAP 的自动配置类
 * @Author 211145187
 * @Date 2024/5/21 16:44
 **/
@Configuration
public class LdapConfiguration {
    private static Logger logger = LoggerFactory.getLogger(LdapConfiguration.class);

    private LdapTemplate ldapTemplate;
    @Value("${spring.ldap.urls}")
    private String dbUrl;
    @Value("${spring.ldap.username}")
    private String username;
    @Value("${spring.ldap.password}")
    private String password;
    @Value("${spring.ldap.base}")
    private String base;

    /**
     * 继承LdapContextSource重写getAnonymousEnv方法来加载,
     * 使连接ldap时用SSL连接(由于修改AD密码时必须使用SSL连接)
     */
//    public class SsldapContextSource extends LdapContextSource {
//        public Hashtable<String, Object> getAnonymousEnv() {
//            System.setProperty("com.sun.jndi.ldap.object.disableEndpointIdentification", "true");
//            Hashtable<String, Object> anonymousEnv = super.getAnonymousEnv();
//            anonymousEnv.put("java.naming.security.protocol", "ssl");
//            anonymousEnv.put("java.naming.ldap.factory.socket", CustomSslSocketFactory.class.getName());
//            anonymousEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
//            return anonymousEnv;
//        }
//    }

    @Bean
    public LdapContextSource contextSource() {
        LdapContextSource contextSource = new LdapContextSource();
        Map<String, Object> config = new HashMap();
        contextSource.setUrl(dbUrl);
        contextSource.setBase(base);
        contextSource.setUserDn(username);
        contextSource.setPassword(password);
        //  解决 乱码 的关键一句
        config.put("java.naming.ldap.attributes.binary", "objectGUID");
        contextSource.setPooled(true);
        contextSource.setBaseEnvironmentProperties(config);
        return contextSource;

//        SsldapContextSource ldapContextSource = new SsldapContextSource();
//        ldapContextSource.setBase(base);
//        ldapContextSource.setUrl(dbUrl);
//        ldapContextSource.setUserDn(username);
//        ldapContextSource.setPassword(password);
//        ldapContextSource.setPooled(false);
//        ldapContextSource.setReferral("follow");
//        ldapContextSource.afterPropertiesSet();
//        return ldapContextSource;
    }

    @Bean
    public LdapTemplate ldapTemplate(LdapContextSource contextSource) {
        if (Objects.isNull(contextSource)) {
            throw new RuntimeException("ldap contextSource error");
        }
        if (null == ldapTemplate) {
            ldapTemplate = new LdapTemplate(contextSource);
        }
        return ldapTemplate;
    }
}

测试类

@SpringBootTest
@RunWith(SpringRunner.class)
public class LdapTest {

    @Autowired
    private LdapTemplate ldapTemplate;

    @Test
    public void listUsers(){
        AndFilter filter = new AndFilter();
        filter.and(new EqualsFilter("objectClass", "inetOrgPerson"));

        List<LdapUser> users = ldapTemplate.search("ou=Develop,ou=Hytera,dc=yaobili,dc=com", filter.encode(), new LdapUserAttributeMapper());
        for (LdapUser user: users ) {
            System.out.println("user: " + user);
        }

//        Assert.assertEquals(123, users.size());
    }

LdapUserAttributeMapper

package com.ldap.mapper;

import com.ldap.entity.LdapUser;
import org.springframework.ldap.core.AttributesMapper;

import javax.naming.NamingException;
import javax.naming.directory.Attributes;

/**
 * 将ldap返回的结果,转成指定对象
 */
public class LdapUserAttributeMapper implements AttributesMapper {

    /**
     * 将单个Attributes转成单个对象
     * @param attrs
     * @return
     * @throws NamingException
     */
    public Object mapFromAttributes(Attributes attrs) throws NamingException {
        LdapUser user  = new LdapUser();

        if(attrs.get("uid") != null){
            user.setUid( attrs.get("uid").get().toString());
        }
        if(attrs.get("cn") != null){
            user.setCn( attrs.get("cn").get().toString());
        }
        if(attrs.get("dn") != null){
            user.setDn( attrs.get("dn").get().toString());
        }
        if(attrs.get("username") != null){
            user.setUsername( attrs.get("username").get().toString());
        }
        if(attrs.get("userPassword") != null){
            user.setUserPassword( attrs.get("userPassword").get().toString());
        }

        return user;
    }
}

我在整体解释下:
我创建了admin管理账户,然后我又创建了2个账户dn: cn=ldapUser1,ou=Develop,ou=Hytera,dc=yaobili,dc=com,所属的组委ou=Develop,ou=Hytera,dc=yaobili,dc=com
我现在需求是java链接ldap,然后读取组Develop(ou=Develop,ou=Hytera,dc=yaobili,dc=com)下面的所有账户,即想把ldapUser1和ldapUser2信息全部读取出来

  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2024-05-23 20:19
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    【您想要解决的问题】 您的目的是解决在使用Java代码连接LDAP服务器时遇到的“LDAP: error code 34 - invalid DN”错误,这个错误通常表示LDAP服务器无法识别或解析提供的Distinguished Name(DN)。

    【问题出现原因】

    1. DN格式错误:LDAP错误代码34通常意味着DN格式不正确或不完整。检查您的LDAP配置和代码中使用的DN是否完全符合LDAP的DN格式规范。
    2. 属性名称不匹配:在LDAP配置中,您可能使用了某些属性名称,如userPassword,但在Java代码中可能没有正确映射或查询这些属性。
    3. 编码问题:LDAP查询可能需要特定的编码格式,如果编码不正确,LDAP服务器可能无法正确解析DN。

    【问题解决方案】

    1. 验证DN格式:确保所有DN都是正确格式的,特别是那些在LDAP操作中使用的DN,比如在搜索或修改请求中。
    2. 检查属性名称:确保LDAP配置中的属性名称与Java代码中使用的属性名称一致。
    3. 使用正确的编码:确保LDAP查询使用正确的编码,特别是当使用特殊字符或二进制数据时。

    【提供代码】 由于您的LDAP配置和Java代码已经比较详细,我将重点放在可能需要修改的地方:

    • 确保objectClass属性在LDAP配置中正确设置,因为这是识别LDAP对象类型的关键。
    • 检查userPassword属性是否在LDAP服务器上正确设置,并且在Java代码中正确映射。

    【代码运行方式】

    1. 确保您的Java开发环境已配置好,比如安装了JDK和IDE(如IntelliJ IDEA或Eclipse)。
    2. 将修改后的代码部署到您的应用服务器上,比如Tomcat或Spring Boot。
    3. 运行您的测试类,检查是否能够成功连接LDAP服务器并检索用户信息。

    【代码预期运行结果】 如果修改正确,预期您的Java应用将能够成功连接到LDAP服务器,并且能够检索到ou=Develop,ou=Hytera,dc=yaobili,dc=com组织单位下的所有用户信息。

    【推荐相关链接】

    1. LDAP DN Syntax - LDAP DN的语法规则
    2. Spring LDAP Documentation - Spring LDAP的官方文档
    3. LDAP Error Codes - LDAP错误代码的详细说明
    4. LDAP Search Filters - LDAP搜索过滤器的使用

    请注意,这些链接仅供参考,您可能需要根据实际情况调整解决方案。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月23日

悬赏问题

  • ¥20 Html备忘录页面制作
  • ¥15 黄永刚的晶体塑性子程序中输入的材料参数里的晶体取向参数是什么形式的?
  • ¥20 数学建模来解决我这个问题
  • ¥15 计算机网络ip分片偏移量计算头部是-20还是-40呀
  • ¥15 stc15f2k60s2单片机关于流水灯,时钟,定时器,矩阵键盘等方面的综合问题
  • ¥15 YOLOv8已有一个初步的检测模型,想利用这个模型对新的图片进行自动标注,生成labellmg可以识别的数据,再手动修改。如何操作?
  • ¥30 NIRfast软件使用指导
  • ¥20 matlab仿真问题,求功率谱密度
  • ¥15 求micropython modbus-RTU 从机的代码或库?
  • ¥15 django5安装失败