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

Cannot remove attributes in ldap with spring ldap

我们需要制作一个 spring 与 spring ldap 一起工作的引导项目。 当我们从一个组中删除一个成员时,每件事都是 good.But,该成员从组中删除(我在 Setmembers 中以调试模式看到它)但是,在 ldap(Oracle Internet Directory)中该成员存在! 请帮助我!

//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);
        }
    }

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

经过多次查找调试,终于找到了问题所在! 在每个 ldap env 中,每次更改后,目录必须提交并应用。 在上面的代码中,我实现了它,但不是以真正的方式! 最好的方法在这里:

@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);
        }
    }