亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

封裝JNDI操作LDAP服務器的工具類(4)

2019-11-18 12:24:29
字體:
來源:轉載
供稿:網友

  目標:使用者只需要會使用List,Map 數據結構,將對LDAP的操作進行封裝
  
  類:主要有三個類
  
  1 Env類 包含LDAP的連接信息
  
  2 LdapConnectionFactory類 ldap連接工廠,提供初始化及獲取ldap連接的方法
  
  3 LdapOperUtils ldap的處理工具類,提供了各種操作ldap的方法。
  
  接 封裝JNDI操作LDAP服務器的工具類(3) LdapOperUtils類的其余方法
  
  /**
  * 在當前連接的DirContext 修改指定Context下的一個 或 多個屬性
  * @param context 連接的DirContext
  * @param cn 指定Context下的名字
  * @param attMap 包含List key為屬性名稱,當屬性為多值時
  * value 為包含多值的List,為單值時,為包含單值的String類型
  * @throws BaseException
  * @throws NamingException
  */
  public static void modifyAttributes(DirContext context, String cn,
  Map attMap) throws
  BaseException, NamingException {
  
  // 參數為空
  if (context == null) {
  String[] args = {
  "context"};
  // 打印錯誤日志
  StringBuffer msglog = new StringBuffer(
  "empty invoke parameter context NULL ");
  log.error(msglog.toString());
  throw new BaseException("error.common.parameter.empty", args);
  }
  
  // 參數為空
  if (attMap == null) {
  String[] args = {
  "attMap"};
  // 打印錯誤日志
  StringBuffer msglog = new StringBuffer(
  "empty invoke parameter attMap NULL ");
  log.error(msglog.toString());
  throw new BaseException("error.common.parameter.empty", args);
  }
  // 參數為空
  if (StringUtils.isEmpty(cn)) {
  String[] args = {
  "cn"};
  // 打印錯誤日志
  StringBuffer msglog = new StringBuffer(
  "empty invoke parameter cn NULL ");
  log.error(msglog.toString());
  throw new BaseException("error.common.parameter.empty", args);
  }
  
  // 為空,退出
  if (attMap.isEmpty()) {
  return;
  }
  // 取所有的屬性key
  Set keySet = attMap.keySet();
  Iterator keyIterator = keySet.iterator();
  Attributes attrs = new BasicAttributes();
  // 迭代所有的屬性key
  while (keyIterator.hasNext()) {
  // 取下一個屬笥
  String key = (String) keyIterator.next();
  Attribute att = null;
  Object valueObj = attMap.get(key);
  
  if (valueObj instanceof List) {
  // 為List ,為多值屬性
  att = new BasicAttribute(key);
  List valueList = (List) valueObj;
  // 加入多值屬性
  for (int i = 0; i < valueList.size(); i++) {
  att.add(valueList.get(i));
  }
  } else if (valueObj instanceof String) {
  att = new BasicAttribute(key, valueObj);
  }
  // 加入
  attrs.put(att);
  }
  context.modifyAttributes(cn, DirContext.REPLACE_ATTRIBUTE, attrs);
  // context.close();
  }
  
  //
  /**
  * 獲取連接的DirContext中指定Context下的指定屬性
  * @param context 連接的DirContext
  * @param cn 指定Context的名稱
  * @param attNameList 要取的屬性的名稱List
  * @return Map包含List ,key 為屬性的名稱,當屬性值為多值時,Value為List類型,
  * 否則,value 為String 類型
  * @throws NamingException
  */
  public static Map getAttributes(DirContext context, String cn,
  List attNameList) throws NamingException {
  Map attsMap = new HashMap();
  Attributes results = null;
  List attValList = null;
  String attrId = null;
  
  if (attNameList == null) {
  results = context.getAttributes(cn);
  } else {
  if (!attNameList.isEmpty()) {
  // results = context.getAttributes(cn);
  String[] stTemp = new String[attNameList.size()];
  /////////////////////////////////////////// 以下方法性能太低 ////////////////////////////////
  //        for (int i = 0; i < attNameList.size(); i++) {
  //          stTemp[i] = (String) attNameList.get(i);
  //        }
  //        results = context.getAttributes(cn,
  //                        stTemp);
  ///////////////////////////////////////////////////////////////////////////////////////////
  // 比較高性能的List 轉為 數組的方法
  results = context.getAttributes(cn,
  (String[]) (attNameList.toArray(stTemp)));
  }
  }
  for (int i = 0; i < attNameList.size(); i++) {
  Attribute attr = results.get((String) attNameList.get(i));
  attrId = (String) attNameList.get(i);
  if (attr != null) {
  if (attr.size() > 0) {
  NamingEnumeration vals = attr.getAll();
  if (vals == null) {
  continue;
  }
  Object obj1 = vals.nextElement();
  if (obj1 == null) {
  continue;
  }
  // 迭代這個屬性的所有屬性值
  while (vals.hasMoreElements()) {
  if (attValList == null) {
  attValList = new ArrayList();
  attValList.add(obj1);
  }
  attValList.add(vals.nextElement());
  }
  // 當屬性為單值域時,存為字符串
  // 當屬性為多值域時,存為包含多值域的List
  if (attValList != null) {
  attsMap.put(attrId, attValList);
  // 清空
  attValList = null;
  } else {
  attsMap.put(attrId, obj1);
  }
  }
  }
  }
  // context.close();
  return attsMap;
  }
  
  /**
  * 在當前連接的DirContext 獲取指定Context下的指定屬性名稱的所有屬性值(一個或多個值)
  * @param context 連接的DirContext
  * @param cn 指定Context的cn名
  * @param attName 屬性名稱
  * @return 返回包括屬性值的List 注重,當屬性只有一個值時,返回的List長度為1,當屬性
  * 是多值屬性時,返回List長度為屬性值的數目
  * @throws NamingException
  */
  public static List getAttributeValues(DirContext context, String cn,
  String attName) throws
  NamingException {
  List attValList = new ArrayList();
  List attNameList = new ArrayList();
  attNameList.add(attName);
  Map attMap = null;
  attMap = getAttributes(context, cn, attNameList);
  
  if (attMap != null) {
  Object attValObj = attMap.get(attName);
  if (attValObj instanceof String) {
  attValList.add((String) attValObj);
  } else if (attValObj instanceof List) {
  attValList = ((List) attValObj);
  }
  }
  // context.close();
  return attValList;
  }
  
  /**
  * 獲取角色的相關信息
  * @param context DirContext
  * @param cn String
  * @param attName String
  * @return String
  * @throws NamingException
  */
  public static String getRoleAttributeValues(DirContext context, String cn,
  String attName) throws
  NamingException {
  String result = "";
  List attNameList = new ArrayList();
  attNameList.add(attName);
  Map attMap = null;
  attMap = getAttributes(context, cn, attNameList);
  
  if (attMap != null) {
  Object attValObj = attMap.get(attName);
  result = (String)attValObj;
  }
  return result;
  }
  
  /**
  * 根據條件查找指定CN的Context下的一層所有屬性
  * @param context 連接了的DirContext
  * @param cn 要查詢的BaseCN名稱
  * @param filter 要查詢的過濾字符串
  * @return 符合查詢結果的List
  * @throws NamingException
  */
  public static List searchContextOne(DirContext context, String cn,
  String filter) throws
  NamingException {
  List resultList = new ArrayList();
  Map resultRowMap = null;
  List attValList = null;
  String attValStr = null;
  // 實例化一個搜索器
  SearchControls constraints = new SearchControls();
  // 設置搜索器的搜索范圍
  constraints.setSearchScope(SearchControls.ONELEVEL_SCOPE);
  // 在基目錄中搜索條件為Env.MY_FILTER的所有屬性 注重:這里返回是的所有的條目集合
  NamingEnumeration results
  = context.search(cn, filter, constraints);
  
  // 打印條目的識別名(DN)及其所有的屬性名,值
  while (results != null && results.hasMore()) {
  // 取一個條目
  SearchResult si = (SearchResult) results.next();
  
  // 獲取條目的所有屬性集合
  Attributes attrs = si.getAttributes();
  if (attrs != null) {
  String attrId = null;
  // 一行數據
  resultRowMap = new HashMap();
  // 打印所有屬性
  for (NamingEnumeration ae = attrs.getAll();
  ae.hasMoreElements(); ) {
  // 獲取一個屬性
  Attribute attr = (Attribute) ae.next();
  attrId = attr.getID();
  Enumeration vals = attr.getAll();
  if (vals == null) {
  continue;
  }
  Object obj1 = vals.nextElement();
  if (obj1 == null) {
  continue;
  }
  // 迭代這個屬性的所有屬性值
  while (vals.hasMoreElements()) {
  if (attValList == null) {
  attValList = new ArrayList();
  attValList.add(obj1);
  }
  attValList.add(vals.nextElement());
  }
  // 當屬性為單值域時,存為字符串
  // 當屬性為多值域時,存為包含多值域的List
  if (attValList != null) {
  resultRowMap.put(attrId, attValList);
  // 清空
  attValList = null;
  } else {
  resultRowMap.put(attrId, obj1);
  }
  
  }
  }
  resultList.add(resultRowMap);
  }
  return resultList;
  }
  
  /**
  * 根所條件查找指定CN的Context下的子樹下的所有屬性
  * @param context 連接了的DirContext
  * @param cn 要查詢的BaseCN名稱
  * @param filter 要查詢的過濾字符串
  * @return 符合查詢結果的List
  * @throws NamingException
  */
  public static List searchContextSub(DirContext context, String cn,
  String filter) throws
  NamingException {
  List resultList = new ArrayList();
  Map resultRowMap = null;
  List attValList = null;
  // 實例化一個搜索器
  SearchControls constraints = new SearchControls();
  // 設置搜索器的搜索范圍
  constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
  // 在基目錄中搜索條件為Env.MY_FILTER的所有屬性 注重:這里返回是的所有的條目集合
  NamingEnumeration results
  = context.search(cn, filter, constraints);
  
  // 打印條目的識別名(DN)及其所有的屬性名,值
  while (results != null && results.hasMore()) {
  // 取一個條目
  SearchResult si = (SearchResult) results.next();
  
  // 獲取條目的所有屬性集合
  Attributes attrs = si.getAttributes();
  if (attrs != null) {
  String attrId = null;
  // 一行數據
  resultRowMap = new HashMap();
  // 打印所有屬性值
  for (NamingEnumeration ae = attrs.getAll();
  ae.hasMoreElements(); ) {
  // 獲取一個屬性
  Attribute attr = (Attribute) ae.next();
  attrId = attr.getID();
  Enumeration vals = attr.getAll();
  if (vals == null) {
  continue;
  }
  Object obj1 = vals.nextElement();
  if (obj1 == null) {
  continue;
  }
  // 迭代這個屬性的所有屬性值
  while (vals.hasMoreElements()) {
  if (attValList == null) {
  attValList = new ArrayList();
  attValList.add(obj1);
  }
  attValList.add(vals.nextElement());
  }
  // 當屬性為單值域時,存為字符串
  // 當屬性為多值域時,存為包含多值域的List
  if (attValList != null) {
  resultRowMap.put(attrId, attValList);
  // 清空
  attValList = null;
  } else {
  resultRowMap.put(attrId, obj1);
  }
  }
  }
  resultList.add(resultRowMap);
  }
  return resultList;
  }
  
  /**
  * 查找指定CN的Context下的子樹下的指定屬性
  * @param context DirContext
  * @param cn String
  * @param filter String
  * @param returnedAtts String[] 屬性名字數組
  * @return List
  * @throws NamingException
  */
  public static List searchContextSub(DirContext context, String cn,
  String filter, String[] returnedAtts) throws
  NamingException {
  List resultList = new ArrayList();
  String attrId = null;
  List attValList = null;
  Map resultRowMap = null;
  // 實例化一個搜索器
  SearchControls constraints = new SearchControls();
  // 設置搜索器的搜索范圍
  constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
  // String[] returnedAtts = {"uniquemember"};
  constraints.setReturningAttributes(returnedAtts);
  // 條目
  NamingEnumeration results
  = context.search(cn, filter, constraints);
  
  // 迭代所有的條目
  while (results != null && results.hasMore()) {
  // 取一個條目
  SearchResult si = (SearchResult) results.next();
  resultRowMap = new HashMap();
  // 獲取條目的指定返回的屬性
  Attributes attrs = si.getAttributes();
  if (attrs != null) {
  // 迭代所有屬性值
  for (NamingEnumeration ae = attrs.getAll();
  ae.hasMoreElements(); ) {
  
  // 獲取一個屬性
  Attribute attr = (Attribute) ae.next();
  attrId = attr.getID();
  Enumeration vals = attr.getAll();
  if (vals == null) {
  continue;
  }
  // 迭代這個屬性的所有屬性值
  while (vals.hasMoreElements()) {
  if (attValList == null) {
  attValList = new ArrayList();
  }
  attValList.add(vals.nextElement());
  }
  // 當屬性為單值域時,存為字符串
  // 當屬性為多值域時,存為包含多值域的List
  if (attValList != null) {
  resultRowMap.put(attrId, attValList);
  // 清空
  attValList = null;
  }
  }
  }
  resultList.add(resultRowMap);
  }
  return resultList;
  }
  
  /**
  * 查找指定CN的Context下的一層指定屬性
  * @param context DirContext
  * @param cn String
  * @param filter String
  * @param returnedAtts String[] 屬性名字數組
  * @return List
  * @throws NamingException
  */
  public static List searchContextOne(DirContext context, String cn,
  String filter, String[] returnedAtts) throws
  NamingException {
  List resultList = new ArrayList();
  String attrId = null;
  List attValList = null;
  Map resultRowMap = null;
  // 實例化一個搜索器
  SearchControls constraints = new SearchControls();
  // 設置搜索器的搜索范圍
  constraints.setSearchScope(SearchControls.ONELEVEL_SCOPE);
  // String[] returnedAtts = {"uniquemember"};
  constraints.setReturningAttributes(returnedAtts);
  // 條目
  NamingEnumeration results
  = context.search(cn, filter, constraints);
  
  // 迭代所有的條目
  while (results != null && results.hasMore()) {
  // 取一個條目
  SearchResult si = (SearchResult) results.next();
  resultRowMap = new HashMap();
  // 獲取條目的指定返回的屬性
  Attributes attrs = si.getAttributes();
  if (attrs != null) {
  // 迭代所有屬性值
  for (NamingEnumeration ae = attrs.getAll();
  ae.hasMoreElements(); ) {
  
  // 獲取一個屬性
  Attribute attr = (Attribute) ae.next();
  attrId = attr.getID();
  Enumeration vals = attr.getAll();
  if (vals == null) {
  continue;
  }
  Object obj1 = vals.nextElement();
  if (obj1 == null) {
  continue;
  }
  // 迭代這個屬性的所有屬性值
  while (vals.hasMoreElements()) {
  if (attValList == null) {
  attValList = new ArrayList();
  attValList.add(obj1);
  }
  attValList.add(vals.nextElement());
  }
  // 當屬性為單值域時,存為字符串
  // 當屬性為多值域時,存為包含多值域的List
  if (attValList != null) {
  resultRowMap.put(attrId, attValList);
  // 清空
  attValList = null;
  } else {
  resultRowMap.put(attrId, obj1);
  }
  }
  }
  resultList.add(resultRowMap);
  }
  return resultList;
  }
  
  /**
  * 在當前的連接DirContext 刪除 指定Context 下的 一個屬性里面包含的子屬性
  * @param context 連接后的DirContext
  * @param cn 指定Context的名稱
  * @param attList 包含要刪除的屬性的名稱
  * @throws BaseException
  * @throws NamingException
  */
  public static void deleteInAttributes(DirContext ctx, String userDN,
  List attList,String flag) throws NamingException {
  if (attList == null attList.size() == 0) {
  return;
  } else {
  int size = attList.size();
  ModificationItem[] mods = new ModificationItem[size];
  for (int i = 0; i < size; i++) {
  Attribute att = null;
  mods[i] = new ModificationItem(DirContext.REMOVE_ATTRIBUTE,
  new BasicAttribute(
  flag, (String) attList.get(i)));
  }
  ctx.modifyAttributes(userDN, mods);
  }
  }
  
  /**
  * 創建一個連接,通過捕捉Exception來確定該用戶是否存在于目標ldap中
  * @param configDto ConfigDto
  * @param uid String
  * @param passWord char[]
  * @return boolean
  * @throws NamingException
  */
  public static boolean authenticate(ConfigDto configDto, String uid, char[] password) throws
  NamingException {
  Hashtable mEnvironment = new Hashtable();
  DirContext mContext = null;
  //創建連接
  mEnvironment.put(Context.INITIAL_CONTEXT_FACTORY,
  configDto.getEnvfactory());
  mEnvironment.put(Context.PROVIDER_URL, configDto.getEnvurl());
  mEnvironment.put(Context.SECURITY_AUTHENTICATION, "simple");
  mEnvironment.put(Context.SECURITY_PRINCipAL,
  Constants.LDAP_PEOPLE_ATTRIBUTE_UID + "=" + uid + "," +
  configDto.getEnvPeopleLoc());
  mEnvironment.put(Context.SECURITY_CREDENTIALS, password);
  try {
  mContext = new InitialDirContext(mEnvironment);
  log.debug("user:"+uid+" login!");
  return true;
  } catch (AuthenticationException ex) {
  log.error("user:"+uid+" don't login because of wrong user name or password!");
  return false;
  }
  }

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩一区二区福利| 国内精品小视频在线观看| 亚洲老板91色精品久久| 伊人成人开心激情综合网| 一区二区三区久久精品| 成人有码视频在线播放| 国产91精品久久久久| 日本久久91av| 久久国产加勒比精品无码| 免费91麻豆精品国产自产在线观看| 国产精品日韩欧美大师| 欧美日韩另类在线| 国产91色在线|免| 精品久久中文字幕久久av| 久久精品99国产精品酒店日本| 亚洲国产成人爱av在线播放| 中文字幕v亚洲ⅴv天堂| 国产亚洲精品综合一区91| 欧美精品videosex牲欧美| 91精品国产99久久久久久| 日韩美女写真福利在线观看| 日韩精品视频中文在线观看| 国产精品丝袜白浆摸在线| 久久久久久免费精品| 精品久久久久久亚洲国产300| 国产亚洲精品久久久久久777| 欧美性猛交xxxxx水多| 亚洲欧美中文日韩在线v日本| 国产欧美精品久久久| 欧美在线视频观看免费网站| 国产成人精品综合久久久| 日韩欧美在线免费观看| 欧美裸体xxxxx| 欧美尺度大的性做爰视频| 久久婷婷国产麻豆91天堂| 久久全球大尺度高清视频| 国产成人欧美在线观看| 国产a∨精品一区二区三区不卡| 性色av香蕉一区二区| 国产精品偷伦免费视频观看的| 91精品国产自产在线| 国产欧美日韩丝袜精品一区| 成人免费淫片aa视频免费| 91精品国产高清| 成人在线国产精品| 国产欧美va欧美va香蕉在线| 国内精品一区二区三区| 亚洲精品成人网| 美日韩丰满少妇在线观看| 性夜试看影院91社区| 狠狠爱在线视频一区| 国产91成人video| 777国产偷窥盗摄精品视频| 日本久久久久久| 国产精品福利在线观看网址| 亚洲免费电影一区| 在线视频欧美日韩| 亚洲人成欧美中文字幕| 亚洲跨种族黑人xxx| 亚洲国产精品免费| 亚洲区一区二区| 久久夜色精品国产欧美乱| 国产91亚洲精品| 欧美亚洲国产日本| 在线播放日韩欧美| 日韩免费在线视频| 亚洲欧美综合另类中字| 国产大片精品免费永久看nba| 精品国产一区二区三区在线观看| 精品国产91乱高清在线观看| 久热99视频在线观看| 精品视频在线观看日韩| 5566日本婷婷色中文字幕97| 日韩男女性生活视频| 国产精品亚洲综合天堂夜夜| 成人精品视频99在线观看免费| 久久精品一区中文字幕| 国产精品福利无圣光在线一区| 日韩网站在线观看| 欧美俄罗斯乱妇| 91精品国产亚洲| 7m精品福利视频导航| 欧美激情视频三区| 26uuu另类亚洲欧美日本一| 久久91精品国产91久久跳| 亚洲图片欧美午夜| 91丝袜美腿美女视频网站| 国产精品99蜜臀久久不卡二区| 欧美日韩在线一区| 国产成人精品免费久久久久| 国产精品亚洲网站| 欧美成人中文字幕在线| 97人洗澡人人免费公开视频碰碰碰| 日韩av在线网址| 亚洲www在线| 亚洲激情成人网| 国自产精品手机在线观看视频| 国产99在线|中文| 在线看片第一页欧美| 久久久久久久久中文字幕| 久久久久久久久久久久久久久久久久av| 欧美大奶子在线| 国产精品igao视频| 久久免费在线观看| 久久久久久成人| 亚洲国产精品va在看黑人| 国产精品久久久久久久久久尿| 色婷婷av一区二区三区久久| 久久久久久久久久婷婷| 91免费精品国偷自产在线| 美日韩精品免费视频| 国外视频精品毛片| 欧美成年人在线观看| 亚洲一区免费网站| 亚洲第一中文字幕| 在线视频免费一区二区| 欧美电影在线观看高清| 亚洲自拍偷拍色片视频| 日韩av免费网站| 国产成人高清激情视频在线观看| 国产在线视频91| 精品久久久久久久久久久久久| 亚洲奶大毛多的老太婆| 91沈先生在线观看| 国产欧美精品日韩| 欧美成人国产va精品日本一级| 精品视频在线播放色网色视频| 欧美日韩在线观看视频| 欧美性资源免费| 欧美视频在线观看免费| 精品免费在线观看| 久久天天躁夜夜躁狠狠躁2022| 亚洲xxxx妇黄裸体| 一区二区三区无码高清视频| 亚洲四色影视在线观看| 亚洲色图综合网| 欧美精品久久久久| 欧美激情中文字幕乱码免费| 热久久99这里有精品| 久热精品视频在线| 日韩亚洲成人av在线| 日韩大胆人体377p| 九色91av视频| 国产精品极品尤物在线观看| 欧美在线视频免费观看| 九九热视频这里只有精品| 国产97免费视| 亚洲人午夜精品| 国产精品国模在线| 亚洲欧美在线一区二区| 欧美成人精品一区二区三区| 欧美成人免费在线观看| 久久6精品影院| 激情成人在线视频| 亚洲欧洲偷拍精品| 欧美日韩亚洲国产一区| 欧美怡春院一区二区三区| 久久伊人色综合| 欧美剧在线观看| 理论片在线不卡免费观看| 久久在精品线影院精品国产| 日本一本a高清免费不卡| 午夜精品久久久久久久久久久久| 不卡在线观看电视剧完整版|