Oracle 无法使用spring ldap删除ldap中的属性
我们需要制作一个与SpringLDAP一起工作的SpringBoot项目。 一切都很好。但是当我们从组中删除一个成员时,该成员删除了表单组(我在Setmembers中看到它处于调试模式),但在ldap(Oracle Internet目录)中,该成员存在! 请帮帮我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
//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);
}
}
请修复文章中的语法。某些部分不可读。请修复文章中的语法。某些部分不可读。