gpt4 book ai didi

java - Spring LDAP 将用户添加到组

转载 作者:行者123 更新时间:2023-11-30 07:25:39 24 4
gpt4 key购买 nike

我正在使用 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= user, ou=People 已添加。我的 create() 方法中还会调用 buildDn() 方法,并且包含完整的 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,并且以下内容包含在 beans 定义 XML 中:

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

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

最佳答案

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

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");

希望这能回答您的问题

关于java - Spring LDAP 将用户添加到组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36843914/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com