2017-07-31 28 views
-2

需要一些包含语句的帮助。登录到我的应用程序后,我正在验证用户标识的属性。包含声明不返回特定字符串

这在我们的测试环境中效果很好,但是当我们进入生产时,我没有看到id的属性。测试和生产之间的不同之处在于,在测试中,我们使用具有两个属性的测试标识 - 读取和写入。在生产中,我们使用我们的id,它有更多的属性与它相关联。

代码如下。我已经插入了一些println来试图找出代码的去向。在生产中,与//4一致的行将打印所有属性(包括代码中列出的2个),但它永远不会从该代码块出来以访问//5

public class LoginFilter implements Filter { 
    private Hashtable hashtable; 
    private String url; 

    private String searchBase; 
    private Log vmsLogger; 

    public void destroy() {} 

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, 
      IOException { 
     HttpServletRequest req = (HttpServletRequest) request; 

     if (vmsLogger.isInfoEnabled()) { 
      vmsLogger.info("** Pre-login filter check **"); 
     } 

     chain.doFilter(request, response); 

     if (vmsLogger.isInfoEnabled()) { 
      vmsLogger.info("** Post-login filter check **"); 
     } 

     try { 
      Subject callerSubject; 
      WSCredential callerCred; 

      callerSubject = WSSubject.getCallerSubject(); 

      if (callerSubject != null) { 
       callerCred = (WSCredential) callerSubject.getPublicCredentials(WSCredential.class).iterator().next(); 

       callerCred.set("SpecialRole", "AutoAgent"); 
       //System.out.println("callerCred = " + callerCred); 
       getAttributes(req, callerCred); 
      } 
     } catch (WSSecurityException wse) { 
      wse.printStackTrace(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     if (vmsLogger.isInfoEnabled()) { 
      vmsLogger.info("** Post-login filter check end **"); 
     } 
    } 

    public void init(FilterConfig config) throws ServletException { 
     vmsLogger = LogFactory.getLog(this.getClass().getName()); 
    } 

    private String getLDAPUrl(){ 

     ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
     InputStream inputStream = classLoader.getResourceAsStream("authenticate.properties"); 
     //System.out.println("AuthProperties = " + inputStream); 

     Properties props = new Properties(); 
     try { 
      props.load(inputStream); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     String url; 

     String serverName = props.getProperty("SERVER"); 
     String port = props.getProperty("PORT"); 

     url = "ldap://" + serverName + ":" + port; 
     //System.out.println("props = " + props); 
     //System.out.println("url = " + url); 

     return url; 
    } 

    private void getAttributes(HttpServletRequest request, WSCredential cred) { 
     try { 
      intialize(cred); 

      String attribute = "memberOf"; 
      String[] attrIDs = new String[] { attribute }; 
      Hashtable hshtbl = new Hashtable(); 

      hshtbl = authWithData(cred.getUniqueSecurityName(), cred.getSecurityName(), request 
        .getParameter("j_password"), attrIDs); 

      Vector attributeValues = new Vector(); 

      if ((hshtbl != null) && hshtbl.containsKey(attribute)) { 
       attributeValues = (Vector) hshtbl.get(attribute); 
       System.out.println("12 hshtbl not null = " + attributeValues); //3 
       //System.out.println("attribute attrIDs = " + attrIDs); 
      } 

      HttpSession session = request.getSession(false); 
      UserInfo userInfo = new UserInfo(); 

      if (attributeValues != null) { 
       System.out.println("attributeValues not null = " + attributeValues); //4 
       if (attributeValues. 
        attributeValues.contains("CN=nw-PPARead,OU=LDAP,OU=NSC Managed,OU=Global,OU=Groups,DC=NWIE,DC=NET") || 
        attributeValues.contains("CN=nw-PPARead,OU=LDAP,OU=NSC Managed,OU=Global,OU=Groups,DC=NWIEPILOT,DC=NET") ||  
        attributeValues.contains("CN=nw-PPAWrite,OU=LDAP,OU=NSC Managed,OU=Global,OU=Groups,DC=NWIE,DC=NET")|| 
        attributeValues.contains("CN=nw-PPAWrite,OU=LDAP,OU=NSC Managed,OU=Global,OU=Groups,DC=NWIEPILOT,DC=NET")) { 
        //Not getting to below statement 
        System.out.println("AttributeValues out of first if" + attributeValues); //5 
        session.setAttribute("privPPA", Boolean.TRUE); 

        if (attributeValues.contains("CN=nw-PPAWrite,OU=LDAP,OU=NSC Managed,OU=Global,OU=Groups,DC=NWIE,DC=NET") || 
         attributeValues.contains("CN=nw-PPAWrite,OU=LDAP,OU=NSC Managed,OU=Global,OU=Groups,DC=NWIEPILOT,DC=NET")) { 
         userInfo.setPrivPPAWrite(Boolean.TRUE); 
        } else { 
         userInfo.setPrivPPAWrite(Boolean.FALSE); 
        } 

        if (attributeValues.contains("CN=nw-PPARead,OU=LDAP,OU=NSC Managed,OU=Global,OU=Groups,DC=NWIE,DC=NET") || 
         attributeValues.contains("CN=nw-PPARead,OU=LDAP,OU=NSC Managed,OU=Global,OU=Groups,DC=NWIEPILOT,DC=NET")) { 
         userInfo.setPrivPPARead(Boolean.TRUE); 
         System.out.println("2 TuserReadInfo = true"); 
        } else { 
         userInfo.setPrivPPARead(Boolean.FALSE); 
        }     
       } 

       if (attributeValues.contains("BoatRead") || attributeValues.contains("BoatWrite")) { 
        session.setAttribute("privBoat", Boolean.TRUE); 

        if (attributeValues.contains("BoatWrite")) { 
         userInfo.setPrivBoatWrite(Boolean.TRUE); 
        } else { 
         userInfo.setPrivBoatWrite(Boolean.FALSE); 
        } 

        if (attributeValues.contains("BoatRead")) { 
         userInfo.setPrivBoatRead(Boolean.TRUE); 
        } else { 
         userInfo.setPrivBoatRead(Boolean.FALSE); 
        } 
       } 

       if (attributeValues.contains("MotorCycleRead") || attributeValues.contains("MotorCycleWrite")) { 
        session.setAttribute("privMotorCycle", Boolean.TRUE); 

        if (attributeValues.contains("MotorCycleWrite")) { 
         userInfo.setPrivMotorCycleWrite(Boolean.TRUE); 
        } else { 
         userInfo.setPrivMotorCycleWrite(Boolean.FALSE); 
        } 

        if (attributeValues.contains("MotorCycleRead")) { 
         userInfo.setPrivMotorCycleRead(Boolean.TRUE); 
        } else { 
         userInfo.setPrivMotorCycleRead(Boolean.FALSE); 
        } 
       } 

       userInfo.setUserID(request.getUserPrincipal().getName()); 
       session.setAttribute("userInfo", userInfo); 

       System.out.println("userInfo out = " + userInfo); 
      } 
     } catch (Exception ex1) { 
      vmsLogger.error("exception", ex1); 
     } 
    } 

    private void intialize(WSCredential cred) throws Exception { 
     //ResourceBundle labels = ResourceBundle.getBundle("VMSPPAConfig"); 
     // Set up default values for LDAP info 
     url = getLDAPUrl(); 

     StringTokenizer stk = new StringTokenizer(cred.getUniqueSecurityName(), ","); 
     String baseDN = ""; 
     String str = null; 

     while (stk.hasMoreTokens()) { 
      str = stk.nextToken(); 

      if (str.startsWith("dc=")) { 
       if (baseDN.equals("")) { 
        baseDN = str; 
       } else { 
        baseDN += "," + str; 
       } 
      } 
     } 

     searchBase = baseDN; 

     // Set up LDAP config settings 
     hashtable = new Hashtable(); 
     hashtable.put("java.naming.ldap.version", "3"); 
     hashtable.put("java.naming.factory.initial", "com.sun.jndi.ldap.LdapCtxFactory"); 
     hashtable.put("java.naming.security.authentication", "Simple"); 
     hashtable.put("java.naming.security.protocol", "ssl"); 
     hashtable.put("java.naming.referral", "follow"); 
     hashtable.put("java.naming.provider.url", url); 
    } 

    private Hashtable authWithData(String userDN, String user, String pass, String[] attIDs) throws Exception { 
     Hashtable ht1; 
     NamingEnumeration namingenumeration; 
     label0: { 
      InitialDirContext initialdircontext = null; 
      hashtable.put("java.naming.security.principal", userDN); 
      hashtable.put("java.naming.security.credentials", pass); 

      String uid = "CN=" + user; 
      SearchControls searchcontrols = new SearchControls(); 
      searchcontrols.setSearchScope(2); 

      //System.out.println("uid = " + uid); 
      //System.out.println("userDN = " + userDN); 
      //System.out.println("user = " + user); 
      //System.out.println("pass = " + pass); 
      //System.out.println("attIDs = " + attIDs); 

      if (attIDs != null) { 
       searchcontrols.setReturningAttributes(attIDs); 
      } 

      try { 
       try { 
        initialdircontext = new InitialDirContext(hashtable); 
       } catch (Exception ex) { 
        throw ex; 
       } 

       namingenumeration = initialdircontext.search(searchBase, uid, searchcontrols); 

       if ((namingenumeration != null) && namingenumeration.hasMore()) { 
        break label0; 
       } 

       hashtable = null; 
      } finally { 
       if (initialdircontext != null) { 
        try { 
         initialdircontext.close(); 
        } catch (Exception ex) { 
         vmsLogger.error("Some internal error has occurred at this point", ex); 
         throw ex; 
        } 
       } 
      } 

      return hashtable; 
     } 

     hashtable = populateReturn(namingenumeration); 
     ht1 = hashtable; 
     System.out.println("ht1 Hashtable = " + ht1); //2 
     return ht1; 
    } 

    private Hashtable populateReturn(NamingEnumeration namingenumeration) throws Exception { 
     Hashtable ht = new Hashtable(); 
     SearchResult searchresult = (SearchResult) namingenumeration.next(); 
     Attributes attributes = searchresult.getAttributes(); 
     String s; 
     Vector vector; 

     for (NamingEnumeration namingenumeration1 = attributes.getIDs(); (namingenumeration1 != null) 
       && namingenumeration1.hasMore(); ht.put(s, vector)) { 
      s = (String) namingenumeration1.next(); 
      vector = new Vector(); 

      int i = 0; 

      for (NamingEnumeration namingenumeration2 = attributes.get(s).getAll(); (namingenumeration2 != null) 
        && namingenumeration2.hasMore(); vector.addElement((String) namingenumeration2.next())) { 
       i++; 
      } 
     } 

     System.out.println("ht under Hashtable = " + ht); //1 

     if (ht.isEmpty()) { 
      return null; 
     } else { 
      return ht; 
     } 
    } 
} 

回答

0

该if语句没有任何条件返回true看来我错了

if (attributeValues != null) { 
      System.out.println("attributeValues not null = " + attributeValues); //4 
      if (**attributeValues.** 
       attributeValues.contains("CN=nw-PPARead,OU=LDAP,OU=NSC Managed,OU=Global,OU=Groups,DC=NWIE,DC=NET") || 
       attributeValues.contains("CN=nw-PPARead,OU=LDAP,OU=NSC Managed,OU=Global,OU=Groups,DC=NWIEPILOT,DC=NET") ||  
       attributeValues.contains("CN=nw-PPAWrite,OU=LDAP,OU=NSC Managed,OU=Global,OU=Groups,DC=NWIE,DC=NET")|| 
       attributeValues.contains("CN=nw-PPAWrite,OU=LDAP,OU=NSC Managed,OU=Global,OU=Groups,DC=NWIEPILOT,DC=NET")) { 
       //Not getting to below statement 

你。试试这个简单的测试:

Vector<String> attributeValues = new Vector(); 
    attributeValues.add("CN=nw-PPARead,OU=LDAP,OU=NSC Managed,OU=Global,OU=Groups,DC=NWIE,DC=NET"); 
    if (attributeValues != null) { 
     System.out.println("attributeValues not null = " + attributeValues); // 4 
     if (attributeValues.contains("CN=nw-PPARead,OU=LDAP,OU=NSC Managed,OU=Global,OU=Groups,DC=NWIE,DC=NET") 
       || attributeValues 
         .contains("CN=nw-PPARead,OU=LDAP,OU=NSC Managed,OU=Global,OU=Groups,DC=NWIEPILOT,DC=NET") 
       || attributeValues 
         .contains("CN=nw-PPAWrite,OU=LDAP,OU=NSC Managed,OU=Global,OU=Groups,DC=NWIE,DC=NET") 
       || attributeValues.contains(
         "CN=nw-PPAWrite,OU=LDAP,OU=NSC Managed,OU=Global,OU=Groups,DC=NWIEPILOT,DC=NET")) { 
      // Not getting to below statement 
      System.out.println("AttributeValues out of first if" + attributeValues); // 5 
     } 

你应该打你// 5系统输出,所以我会仔细检查你有硬编码字符串中的IF逻辑。

+0

缺少通过IDE进行调试,您是否尝试过(可能是您的控制台/ IDE中的显示问题?),而不是打印出整个矢量,只需打印大小(attributeValues.size())即可排除控制台不能正确显示?如果没有,我会调试它,看看你可以收集什么。 – Mike

+0

Vector attributeValues = new Vector(); 这将无法正常工作 - 代码移动时出错:1.4源代码中不支持泛型(使用源5或更高版本来启用泛型) – FirePhoenix

+0

刚刚移动了 attributeValues.add(“CN = nw-PPARead,OU = LDAP,OU = NSC托管,OU =全局,OU =组,DC = NWIE,DC = NET“); ,它的工作原理。 虽然拿出了Vector ,因为这不兼容。当我打印出属性时,CN = nw-PPARead,OU = LDAP,OU = NSC Managed,OU = Global,OU =组,DC = NWIE,DC = NET与其他一些打印在一起。 – FirePhoenix