例如 memberOf出现俩次,但是search方法拿到遍历出只有一个memberOf,丢失一个
3条回答 默认 最新
- 社区专家-Monster-XH 2023-05-04 20:23关注
基于Monster 组和GPT的调写:
- 要验证用户的账号和密码是否正确,可以使用LDAP提供的bind()方法,将用户提供的用户名和密码作为参数绑定到LDAP目录树上的用户对象上。如果绑定成功,则表示提供的用户名和密码是正确的。
下面是一个简单的示例代码:
public static boolean authenticate(LdapContext ctx, String username, String password) { boolean result = false; try { ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, "uid=" + username); ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, password); ctx.reconnect(null); result = true; } catch (NamingException e) { e.printStackTrace(); } return result; }
在这个示例中,我们使用用户提供的用户名和密码来绑定LDAP目录树上的用户对象。如果绑定成功,则返回true,否则返回false。
关于搜索用户属性出现重复的问题,可能是由于LDAP目录树中的用户对象有多个属性具有相同的名称。为了避免这种情况,可以使用Attribute.getAll()方法获取属性的所有值,而不是只使用Attribute.get()方法获取第一个值。这样可以保证获取到所有的属性值,避免丢失任何一个属性值。
下面是修改后的示例代码:
public static List<LdapUser> search(LdapContext ctx,String basedn){ List<LdapUser> lm=new ArrayList<LdapUser>(); try { if(ctx!=null){ //过滤条件 String filter = "(objectClass=*)"; String[] attrPersonArray = { "objectClass","uid", "userPassword", "displayName", "cn", "sn", "mail", "description","objectGUID","member" }; SearchControls searchControls = new SearchControls();//搜索控件 searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);//搜索范围,设为2会查询子节点。 searchControls.setDerefLinkFlag(false); searchControls.setReturningAttributes(attrPersonArray); NamingEnumeration<SearchResult> answer = ctx.search(basedn, filter,searchControls); int num= 0; while (answer.hasMore()) { SearchResult result = (SearchResult) answer.next(); NamingEnumeration<? extends Attribute> attrs = result.getAttributes().getAll(); LdapUser lu=new LdapUser(); while (attrs.hasMore()) { Attribute attr = (Attribute) attrs.next(); num++; if("uid".equals(attr.getID())){ lu.setUid(attr.get().toString()); }else if("displayName".equals(attr.getID())){ lu.setDisplayName(attr.get().toString()); }else if("cn".equals(attr.getID())){ lu.setCn(attr.get().toString()); }else if("sn".equals(attr.getID())){ lu.setSn(attr.get().toString()); }else if("memberOf".equals(attr.getID())) { // 处理属性值出现重复的情况 NamingEnumeration<?> values = attr.getAll(); while (values.hasMore()) { String value = values.next().toString(); if (value.startsWith("cn=")) { lu.addMemberOf(value); } } } } if(lu.getUid()!=null) lm.add(lu); } } }catch (Exception e) { e.printStackTrace(); } return lm; }
在处理"memberOf"属性时,使用Attribute.getAll()方法获取属性的所有值,然后使用一个循环遍历每个属性值,将以"cn="开头的属性值添加到LdapUser对象的memberOf属性中。这样就可以避免丢失任何一个属性值了。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用
悬赏问题
- ¥15 关于#自动化#的问题:如何通过电脑控制多相机同步拍照或摄影(相机或者摄影模组数量大于60),并将所有采集的照片或视频以一定编码规则存放至规定电脑文件夹内
- ¥20 深信服vpn-2050这台设备如何配置才能成功联网?
- ¥15 Arduino的wifi连接,如何关闭低功耗模式?
- ¥15 Android studio 无法定位adb是什么问题?
- ¥15 angular项目错误
- ¥20 需要帮我远程操控一下,运行一下我的那个代码,我觉得我无能为力了
- ¥20 有偿:在ubuntu上安装arduino以及其常用库文件。
- ¥15 请问用arcgis处理一些数据和图形,通常里面有一个根据点划泰森多边形的命令,直接划的弊端是只能执行一个完整的边界,但是我们有时候会用到需要在有很多边界内利用点来执行划泰森多边形的命令
- ¥30 在wave2foam中执行setWaveField时遇到了如下的浮点异常问题,请问该如何解决呢?
- ¥750 关于一道数论方面的问题,求解答!(关键词-数学方法)