Oracle 无法使用spring ldap删除ldap中的属性

Oracle 无法使用spring ldap删除ldap中的属性,oracle,spring-boot,spring-ldap,Oracle,Spring Boot,Spring Ldap,我们需要制作一个与SpringLDAP一起工作的SpringBoot项目。 一切都很好。但是当我们从组中删除一个成员时,该成员删除了表单组(我在Setmembers中看到它处于调试模式),但在ldap(Oracle Internet目录)中,该成员存在! 请帮帮我 //Group Entry @Entry(objectClasses = {"top", "groupOfUniqueNames", "orclGroup"}, base = "cn=Groups") public final cla

我们需要制作一个与SpringLDAP一起工作的SpringBoot项目。 一切都很好。但是当我们从组中删除一个成员时,该成员删除了表单组(我在Setmembers中看到它处于调试模式),但在ldap(Oracle Internet目录)中,该成员存在! 请帮帮我

//Group Entry
@Entry(objectClasses = {"top", "groupOfUniqueNames", "orclGroup"}, base = "cn=Groups")
public final class Group {

    @Id
    private Name dn;

    @Attribute(name = "cn")
    private String name;


    private String description;

    private String displayName;

    @Attribute(name = "ou")
    private String ou;

    @Attribute(name = "uniqueMember")
    private Set<Name> members;


    public void addMember(Name newMember) {
        members.add(newMember);
    }

    public void removeMember(Name member) {
        members.remove(member);
    }


//Custom LdapUtils 
public class CustomLdapUtils {

private static final String GROUP_BASE_DN = "cn=Groups";

    private static final String USER_BASE_DN = "cn=Users";

    public Name buildGroupDn(String name) {
        return LdapNameBuilder.newInstance(GROUP_BASE_DN)
                .add("cn","Charts")
                .add("cn",name)
                .build();
    }

    private static final CsutomLdapUtils LDAP_UTILS = new CsutomLdapUtils ();
    private CsutomLdapUtils () {
    }
    public Name buildPersonDn(String name) {
        return LdapNameBuilder.newInstance(USER_BASE_DN)
                .add("cn", name)
                .build();
    }
}

//Controller
 @DeleteMapping(value = "/memberOfGroup", consumes = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<?> removeMemberFromGroup(@RequestBody Map<String,String> map) throws NamingException {
        List<Group> groupToFind = ldapSearchGroupsService.getGroupByCn(map.get("groupName"));

        List<User> userToFind = ldapSearchUserService.getAllUserByUserName(map.get("userName"));
        if (groupToFind.isEmpty()) {
            //TODO : Group no found!
            return new ResponseEntity<>(HttpStatus.NO_CONTENT);
        } else {
            for (Group group1 : groupToFind) {
                group1.removeMember(userToFind.stream().findAny().get().getDn());
                //ldapBindGroupService.deleteMemberFromGroup(group1);
                DirContextOperations ctx = ldapTemplate.lookupContext(CustomLdapUtils.getInstance().buildGroupDn(map.get("groupName")));
                ctx.removeAttributeValue("uniqueMember",map.get("userName"));
                ctx.rebind(CustomLdapUtils.getInstance().buildGroupDn(map.get("groupName")),map.get("groupName"));
                ldapTemplate.modifyAttributes(ctx);
            }
            return new ResponseEntity<>(HttpStatus.OK);
        }
    }
//组条目
@条目(objectClasses={“top”、“groupOfUniqueNames”、“orclGroup”},base=“cn=Groups”)
公开期末班{
@身份证
私名dn;
@属性(name=“cn”)
私有字符串名称;
私有字符串描述;
私有字符串显示名;
@属性(name=“ou”)
私人字符串ou;
@属性(name=“uniqueMember”)
私有集合成员;
public void addMember(名称newMember){
成员。添加(新成员);
}
公共无效删除成员(名称成员){
成员。移除(成员);
}
//自定义LdapUtils
公共类CustomLdapUtils{
私有静态最终字符串组\u BASE\u DN=“cn=Groups”;
私有静态最终字符串USER\u BASE\u DN=“cn=Users”;
公共名称buildGroupDn(字符串名称){
返回LdapNameBuilder.newInstance(组\u基本\u DN)
.add.(“cn”,“图表”)
。添加(“cn”,名称)
.build();
}
私有静态最终CsutomLdapUtils LDAP_UTILS=new CsutomLdapUtils();
私有CSUTOMLDAPTILS(){
}
公共名称buildPersonDn(字符串名称){
返回LdapNameBuilder.newInstance(用户\u基本\u DN)
。添加(“cn”,名称)
.build();
}
}
//控制器
@DeleteMapping(value=“/memberOfGroup”,consumes=MediaType.APPLICATION\u JSON\u value)
public ResponseEntity removeMemberFromGroup(@RequestBody映射)引发NamingException{
List groupToFind=ldapsearchgroupssservice.getGroupByCn(map.get(“groupName”);
List userToFind=ldapSearchUserService.getalluserbysername(map.get(“用户名”));
if(groupToFind.isEmpty()){
//TODO:找不到组!
返回新的响应属性(HttpStatus.NO_内容);
}否则{
对于(组1:groupToFind){
group1.removember(userToFind.stream().findAny().get().getDn());
//ldapBindGroupService.deleteMemberFromGroup(组1);
DirContextOperations ctx=ldapTemplate.lookupContext(CustomLdapUtils.getInstance().buildGroupDn(map.get(“groupName”));
ctx.removeAttributeValue(“uniqueMember”,map.get(“userName”);
rebind(CustomLdapUtils.getInstance().buildGroupDn(map.get(“groupName”)),map.get(“groupName”);
ldapTemplate.modifyAttributes(ctx);
}
返回新的响应状态(HttpStatus.OK);
}
}

代码中有问题吗?或者需要一些方法吗?

经过几次搜索和调试,我终于找到了问题! 在每个ldap环境中,每次更改后,目录必须是commit和apply。 在上面的代码中,我实现了这一点,但不是以真实的方式! 最好的方法是:

@DeleteMapping(value = "/membersOfGroup", consumes = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<?> removeMemberFromGroup(@RequestBody Map<String,String> map) {
        List<Group> groupToFind = ldapSearchGroupsService.getGroupByCn(map.get("groupName"));
        List<User> userToFind = ldapSearchUserService.getAllUserByUserName(map.get("userName"));
        if (groupToFind.isEmpty()) {
            //TODO : Group no found!
            return new ResponseEntity<>(HttpStatus.NO_CONTENT);
        } else {
            for (Group group1 : groupToFind) {
                group1.removeMember(userToFind.stream().findAny().get().getDn());
                DirContextOperations ctx = ldapTemplate.lookupContext(CustomLdapUtils.getInstance().buildGroupDn(map.get("groupName")));
                ctx.removeAttributeValue("member",CustomLdapUtils.getInstance().buildPersonDn(map.get("userName")));

//True way
                ldapTemplate.update(group1);
            }
            return new ResponseEntity<>(HttpStatus.OK);
        }
    }
@DeleteMapping(value=“/membersOfGroup”,consumes=MediaType.APPLICATION\u JSON\u value)
public ResponseEntity removeMemberFromGroup(@RequestBody映射){
List groupToFind=ldapsearchgroupssservice.getGroupByCn(map.get(“groupName”);
List userToFind=ldapSearchUserService.getalluserbysername(map.get(“用户名”));
if(groupToFind.isEmpty()){
//TODO:找不到组!
返回新的响应属性(HttpStatus.NO_内容);
}否则{
对于(组1:groupToFind){
group1.removember(userToFind.stream().findAny().get().getDn());
DirContextOperations ctx=ldapTemplate.lookupContext(CustomLdapUtils.getInstance().buildGroupDn(map.get(“groupName”));
removeAttributeValue(“成员”,CustomLdapUtils.getInstance().buildPersonDn(map.get(“用户名”));
//正道
ldapTemplate.update(group1);
}
返回新的响应状态(HttpStatus.OK);
}
}

经过几次搜索和调试,我终于找到了问题! 在每个ldap环境中,每次更改后,目录必须是commit和apply。 在上面的代码中,我实现了这一点,但不是以真实的方式! 最好的方法是:

@DeleteMapping(value = "/membersOfGroup", consumes = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<?> removeMemberFromGroup(@RequestBody Map<String,String> map) {
        List<Group> groupToFind = ldapSearchGroupsService.getGroupByCn(map.get("groupName"));
        List<User> userToFind = ldapSearchUserService.getAllUserByUserName(map.get("userName"));
        if (groupToFind.isEmpty()) {
            //TODO : Group no found!
            return new ResponseEntity<>(HttpStatus.NO_CONTENT);
        } else {
            for (Group group1 : groupToFind) {
                group1.removeMember(userToFind.stream().findAny().get().getDn());
                DirContextOperations ctx = ldapTemplate.lookupContext(CustomLdapUtils.getInstance().buildGroupDn(map.get("groupName")));
                ctx.removeAttributeValue("member",CustomLdapUtils.getInstance().buildPersonDn(map.get("userName")));

//True way
                ldapTemplate.update(group1);
            }
            return new ResponseEntity<>(HttpStatus.OK);
        }
    }
@DeleteMapping(value=“/membersOfGroup”,consumes=MediaType.APPLICATION\u JSON\u value)
public ResponseEntity removeMemberFromGroup(@RequestBody映射){
List groupToFind=ldapsearchgroupssservice.getGroupByCn(map.get(“groupName”);
List userToFind=ldapSearchUserService.getalluserbysername(map.get(“用户名”));
if(groupToFind.isEmpty()){
//TODO:找不到组!
返回新的响应属性(HttpStatus.NO_内容);
}否则{
对于(组1:groupToFind){
group1.removember(userToFind.stream().findAny().get().getDn());
DirContextOperations ctx=ldapTemplate.lookupContext(CustomLdapUtils.getInstance().buildGroupDn(map.get(“groupName”));
removeAttributeValue(“成员”,CustomLdapUtils.getInstance().buildPersonDn(map.get(“用户名”));
//正道
ldapTemplate.update(group1);
}
返回新的响应状态(HttpStatus.OK);
}
}

请修复文章中的语法。某些部分不可读。请修复文章中的语法。某些部分不可读。