Spring LDAP将用户添加到组

时间:2016-04-25 14:45:59

标签: java spring ldap

我正在使用Spring LDAP 2.04和OpenLDAP。使用http://docs.spring.io/autorepo/docs/spring-ldap/current/reference/#dns-as-attribute-values处的模型代码我正在尝试将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();
    }

这很有用。用户将作为uniqueMember添加到组中,但没有完全限定的LDAP名称,即,而不是uid = user,ou = People,dc = company,dc = com only uid =用户,ou =添加人员。 buildDn()方法也在我的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类实现了BaseLdapNameAware,以下内容包含在bean定义XML中:

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

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

1 个答案:

答案 0 :(得分:1)

两个操作之间的差异(&#34;创建用户&#34;以及&#34;将用户添加到组&#34;)是第一个创建用户条目(DN = userDN),第二个更新组条目(DN = groupDN)。换句话说,这两个操作是针对两种不同的&#34;类型进行的。如果你愿意的话。

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

创建用户时,您可以使用用户DN来创建上下文:

DirContextAdapter context = new DirContextAdapter(buildDn(user));

当您更新群组时,请使用群组来代替:

DirContextOperations ctx = ldapTemplate.lookupContext(roleDn);

话虽这么说,为了修复您的代码,您需要将uniqueMember属性设置为用户的完整DN,如下例所示:

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

希望这能回答你的问题