Java SpringLDAP将用户添加到组

Java SpringLDAP将用户添加到组,java,spring,ldap,Java,Spring,Ldap,我正在使用SpringLDAP 2.04和OpenLDAP。我正在尝试使用上的模型代码将LDAP用户添加到组中。这是我的代码: public void addPersonToRole(String roleName, IUser user){ Name roleDn = buildGroupDn(roleName); Name userDn = buildDn(user); DirContextOperations ctx = ldapTempla

我正在使用SpringLDAP 2.04和OpenLDAP。我正在尝试使用上的模型代码将LDAP用户添加到组中。这是我的代码:

public void addPersonToRole(String roleName, IUser user){
        Name roleDn = buildGroupDn(roleName);
        Name userDn = buildDn(user);
        DirContextOperations ctx = ldapTemplate.lookupContext(roleDn);
        ctx.addAttributeValue("uniqueMember",userDn);
        try{
            ldapTemplate.modifyAttributes(ctx);
        }catch(Exception ex){
            System.out.println(ex.getMessage());
        }
    }

    protected Name buildDn(IUser user){
        return buildUserDnFromString("People",user.getUid());
    }

    protected Name buildUserDnFromString(String company, String userID){
        return LdapNameBuilder.newInstance()
                .add("ou", company)
                .add("uid", userID)
                .build();
    }


    protected Name buildGroupDn(String groupName){
        return LdapNameBuilder.newInstance("ou=Roles")
                .add("cn",groupName)

                .build();
    }
这在一定程度上起作用。用户将作为唯一成员添加到组中,但没有完全限定的LDAP名称,即,添加的不是uid=user,而是ou=People,dc=company,dc=comonlyuid=user,ou=People。buildDn()方法也在my create()方法中被调用,并且包含完整的LDAP路径以成功创建新用户

public void create(IUser user) {
        DirContextAdapter context = new      DirContextAdapter(buildDn(user));
        mapToContext(user, context);
        try{
        ldapTemplate.bind(context);
        }catch(Exception ex){
            System.out.println(ex.getMessage());
        }
    }

protected void mapToContext(IUser user, DirContextOperations context){
        context.setAttributeValues("objectclass", new String[] { "top",
                "person", "pilotPerson", "OpenLDAPperson" });
        context.setAttributeValue("uid", user.getUid());
        context.setAttributeValue("cn", user.getFullName());
        context.setAttributeValue("sn", StringUtils.substringAfterLast(user.getFullName()," "));
        if(StringUtils.isNotBlank(user.getDescription())) context.setAttributeValue("description", user.getDescription());
        if(StringUtils.isNotBlank(user.getUserPassword())) context.setAttributeValue("userPassword", user.getUserPassword());
        if(StringUtils.isNotBlank(user.getEmail())) context.setAttributeValue("mail",user.getEmail());
    }
mapToContect()调用是否起到了作用?如果我尝试显式地将公司信息添加到用户DN,则会出现格式错误的uniqueMember对象错误

我的java类实现BaselDaNameAware,beans定义XML中包含以下内容:

<bean class="org.springframework.ldap.core.support.BaseLdapPathBeanPostProcessor"/>


两个问题:1。我的代码中是否存在阻止组添加的错误?2.为什么将公司信息(即LDAP基本路径)放在组添加上而不是创建上?

这两个操作(“创建用户”和“将用户添加到组”)之间的区别在于,第一个操作创建用户条目(DN=userDN),第二个操作更新组条目(DN=groupDN)。换句话说,如果愿意,这两个操作将针对两种不同的“类型”条目执行

Spring会自动将基本DN(dc=company,dc=com)附加到用于创建上下文的DN中,但不会将其添加到其他属性中,例如
uniqueMember

创建用户时,使用用户DN创建上下文:

DirContextAdapter context = new DirContextAdapter(buildDn(user));
更新组时,请改用groupDN:

DirContextOperations ctx = ldapTemplate.lookupContext(roleDn);
也就是说,要修复代码,您需要将uniqueMember属性设置为用户的完整DN,如以下示例所示:

ctx.addAttributeValue("uniqueMember","uid=user, ou=People, dc=company,dc=com");

希望这能回答你的问题

你的问题到底是什么?你面临的问题是什么?